ServiceStack Redis客户端Get <t>(key)从字符串数据中删除引号

时间:2019-02-19 10:51:54

标签: redis double-quotes servicestack.redis

我正在使用ServiceStack.Redis库与Redis一起使用。首先,我实现了this解决方案。 get / set方法适用于纯文本/字符串。

现在,当我保存带引号的字符串(带有转义字符)时,它可以正确保存(我在redis-cli中验证了同样的含义)。但是Get方法会返回删除了所有双引号的字符串。

例如保存此字符串-“ TestSample” 已保存并按预期方式获得。也, 保存“ TestSample \” with \“ \” quotes \“” 很好,并且在redis-cli中显示相同。但是Get方法的输出变为“带引号的TestSample”

     public bool SetDataInCache<T>(string cacheKey, T cacheData)
    {

        try
        {
            using (_redisClient = new RedisClient(_cacheConfigs.RedisHost))
            {                   
                _redisClient.As<T>().SetValue(cacheKey, cacheData, new TimeSpan(0,0,300));
            }

            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }

    public T GetDataFromCacheByType<T>(string cacheKey)
    {
        T retVal = default(T);

        try
        {
            using (_redisClient = new RedisClient(_cacheConfigs.RedisHost))
            {
                if (_redisClient.ContainsKey(cacheKey))
                {
                    var wrapper = _redisClient.As<T>();
                    retVal = wrapper.GetValue(cacheKey);
                }
                return retVal;
            }
        }
        catch (Exception ex)
        {                
            return retVal;
        }

}

用法:

   cacheObj.SetDataInCache("MyKey1","TestSample");
   cacheObj.SetDataInCache("MyKey2","TestSample \"with\" \"quotes\"");

   string result1 = Convert.ToString(cacheObj.GetDataFromCacheByType<string>("MyKey1"));
   string result2 = Convert.ToString(cacheObj.GetDataFromCacheByType<string>("MyKey2"));

Actual:“带引号的TestSample”

预期:“ TestSample \” with \“ \” quotes \“”

1 个答案:

答案 0 :(得分:0)

Typed Generic API仅用于创建用于序列化复杂类型的通用Redis Client。如果您要实现通用缓存,则应改用IRedisClient API,例如:

_redisClient.Set(cacheKey, cacheData, new TimeSpan(0,0,300));

然后使用以下代码找回

var retVal = _redisClient.Get<T>(cacheKey);

或者用于保存字符串,或者如果您想自己序列化POCO,则可以使用IRedisClient SetValue / GetValue字符串API,例如:

_redisClient.SetValue(cacheKey, cacheData.ToJson());
var retVal = _redisClient.GetValue(cacheKey).FromJson<T>();
  

注意:调用IRedisClient.ContainsKey()会执行其他不必要的Redis I / O操作,因为无论如何您都返回default(T),您只需调用_redisClient.Get<T>()即可,它返回不存在的默认值键。