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
![](https://img2023.cnblogs.com/blog/1291365/202303/1291365-20230309144557395-1213048705.png)