Senparc.CO2NET icon indicating copy to clipboard operation
Senparc.CO2NET copied to clipboard

BaseContainer.GetAllItem()报错

Open houta-higuchi opened this issue 4 years ago • 1 comments

调用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缓存策略也有这个问题

houta-higuchi avatar Jun 16 '20 01:06 houta-higuchi

比如AContainer和BContainer,
A的命名空间时Senparc:DefaultCache:A
B的命名空间时Senparc:DefaultCache:B
调用AContainer.GetAllItem时会把B的数据也读进来,导致json反序列化失败

houta-higuchi avatar Jun 16 '20 01:06 houta-higuchi

@houta-higuchi 这个传入的 key 实际并没有被用到,var keyPattern = GetFinalKey("*"); 是为了获取当前命名空间缓存的前缀的表达式。

JeffreySu avatar Jun 12 '23 15:06 JeffreySu