我正在使用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 \“”
答案 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>()
即可,它返回不存在的默认值键。