ABP Redis 与 RedisClient 相互读取

本文说明的是 ABP 封装的Redis 和 安装客户端ServiceStack.Redis.RedisClient 互相读取数据

 

 

 我为什么会用到这个需求呢,原因是独立出的服务要往redis写数据,发现写进去了,ABP框架的WebApi读取不到我写的KEY,根据客户端验证发现他前面带入了n:key,c:key

所以我写入的时候也默认加上了n:,c: 如下代码

 

        public void readis(Dictionary<string, IList<HardDiskPartition>> redis, string key)
        {
            ServiceStack.Redis.RedisClient client = new ServiceStack.Redis.RedisClient("127.0.0.1", 6379);
            //ServiceStack.Redis.RedisClient client = new ServiceStack.Redis.RedisClient("60.251.129.78", 6379);
            client.Db = 4;
            ////读取
            Dictionary<string, IList<HardDiskPartition>> ComputerService = null;
            string json = client.Get<string>("n:ComputerService,c:ComputerService");
            ABPRedis json2 = client.Get<ABPRedis>("n:ComputerService,c:ComputerService");
            //ComputerService = client.Get<Dictionary<string, IList<HardDiskPartition>>>("n:ComputerService,c:ComputerService");
            //var a  = client.Get<object>("n:yesterDayAdd,c:yesterDayAdd");


            if (json2 != null && json2.Payload != null)
            {
                ComputerService = JsonConvert.DeserializeObject<Dictionary<string, IList<HardDiskPartition>>>(json2.Payload.ToString());
            }
            if (ComputerService != null)
            {
                if (ComputerService.Keys.Contains(key))
                {
                    ComputerService[key] = redis[key];
                }
                else
                {
                    ComputerService.Add(key, redis[key]);
                }
            }
            else
            {
                ComputerService = redis;
            }
            //string pwd = client.Get<string>("password");
            //存储
            var result = JsonConvert.SerializeObject(ComputerService);
            // 这样写的原因是 因为ABP 读取的时候是读取 Payload 的值 不封装的话 webapi读取不到
            var obj888 = new
            {
                Payload = result,
                Type = "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Collections.Generic.IList`1[[GetComputerService.HardDiskPartition, GetComputerService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"
            };
            client.Set("n:ComputerService,c:ComputerService", obj888);

        }


 

    public class HardDiskPartition
    {
        #region Data
        private string _PartitionName;
        private double _FreeSpace;
        private double _SumSpace;
        private string _updateTime;
        #endregion //Data

        #region Properties
        /// 
        /// 空余大小
        /// 
        public double FreeSpace
        {
            get { return _FreeSpace; }
            set { this._FreeSpace = value; }
        }
        /// <summary>
        /// 更新时间
        /// </summary>
        public string UpdateTime
        {
            get { return _updateTime; }
            set { this._updateTime = value; }
        }
        /// 
        /// 使用空间
        /// 
        public double UseSpace
        {
            get { return _SumSpace - _FreeSpace; }
        }
        /// 
        /// 总空间
        /// 
        public double SumSpace
        {
            get { return _SumSpace; }
            set { this._SumSpace = value; }
        }
        /// 
        /// 分区名称
        /// 
        public string PartitionName
        {
            get { return _PartitionName; }
            set { this._PartitionName = value; }
        }
        /// 
        /// 是否主分区
        /// 
        public bool IsPrimary
        {
            get
            {
                //判断是否为系统安装分区
                if (System.Environment.GetEnvironmentVariable("windir").Remove(2) == this._PartitionName)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
        #endregion //Properties
    }

代码中写入了一个匿名对象,原因是为了abp webapi读取的时候能去解PayLoad 里面的数据, 至于下面的Type 不会写的人可以在ABPWebApi中的redis去写入进去,然后复制写死,因为类型是不会变的。这样弄的原因是采用同样的数据类型ABPRedis会自动帮你直接转换数据。 获取里面的值如下代码:

 new
            {
                Payload = result,
                Type = "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Collections.Generic.IList`1[[GetComputerService.HardDiskPartition, GetComputerService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"
            };
    public Dictionary<string, IList<HardDiskPartition>> ComputerService()
        {
            //Dictionary<string, IList<HardDiskPartition>> obj = new Dictionary<string, IList<HardDiskPartition>>
            //{
            //    ["台湾78"] = new List<HardDiskPartition>()
            //    {
            //         new HardDiskPartition
            //         {
            //              FreeSpace=0,
            //               PartitionName="xxxxxxxx",
            //                SumSpace=1,
            //                 UpdateTime=DateTime.Now.ToShortDateString()
            //         }
            //    }
            //};
            //_cacheManager.GetCache("ComputerService10").Set("ComputerService10", obj);
           return (Dictionary<string, IList<HardDiskPartition>>)_cacheManager.GetCache("ComputerService").GetOrDefault("ComputerService");
          }

上面代码中注释掉的部分是上面说到的 用ABPRedis 封装好的写入数据进去,好用redis可视化工具去查看到Type的值,方便复制。

为什么读取的时候不加上n:,c: 因为默认是加了的 所以只用写ComputerService 就好

 

 

 

 

总结:ABP的redis默认是在写入key的时候给你的key加了n:,c:  并且写入数据的时候多加了个对象,对象属性为:Payload 和 Type

 

 

 

 

posted @ 2022-02-07 17:27  颖子的踏坑路线  阅读(172)  评论(0编辑  收藏  举报