Senparc.CO2NET
Senparc.CO2NET copied to clipboard
BaseContainer.GetAllItem()报错
调用BaseContainer的GetAllItem方法,发现报错“json转换失败”。后来查看源码发现,是这个方法有问题:
namespace Senparc.CO2NET.Cache.CsRedis
{
/// <summary>
/// Redis的Object类型容器缓存(Key为String类型),Key-Value 类型储存
/// </summary>
public class RedisObjectCacheStrategy : BaseRedisObjectCacheStrategy
{
/// <summary>
/// 根据 key 的前缀获取对象列表(最多 99999 条)
/// </summary>
public IList<T> GetAllByPrefix<T>(string key)
{
var keyPattern = GetFinalKey("*");//获取带Senparc:DefaultCache:前缀的Key([DefaultCache]
var keys = base.Client.Keys(/*database: Client.GetDatabase().Database,*/ pattern: keyPattern/*, pageSize: 99999*/);
List<T> list = new List<T>();
foreach (var fullKey in keys)
{
var obj = Get<T>(fullKey, true);
if (obj != null)
{
list.Add(obj);
}
}
return list;
}
}
}
应该是直接使用传进来的key,而不是调用GetFinalKey。GetFinalKey返回的是设置的redis命名空间,会返回所有key,因此反序列化时出现问题。应该直接使用key。其他的redis缓存策略也有这个问题
比如AContainer和BContainer,
A的命名空间时Senparc:DefaultCache:A
B的命名空间时Senparc:DefaultCache:B
调用AContainer.GetAllItem时会把B的数据也读进来,导致json反序列化失败
@houta-higuchi 这个传入的 key 实际并没有被用到,var keyPattern = GetFinalKey("*");
是为了获取当前命名空间缓存的前缀的表达式。