我正在编写一个缓存提供程序来缓存任何类型的对象。当我从缓存中读取值时,问题是转换为正确的类型。
using (var redisClient = redisClientsManager.GetClient())
{
redisClient.Set(key, value, new TimeSpan(1, 0, 0));
}
因此很容易将对象放入缓存中,然后将其转换为字符串。当我把它从缓存中拉出来时,它会变得有趣
using (var redisClient = redisClientsManager.GetClient())
{
return redisClient.Get<object>(key);
}
这不起作用,因为我们没有正确的类型来转换,所以默认是返回 json 字符串。
我在想我应该为我所有的食人鱼对象创建一个哈希然后有这样的东西
piranha:cache id = "{ some json }"
piranha:cache id:type = PAGETYPE
这将允许我在将对象保存到缓存时设置对象类型。我想知道是否有更好的方法来获取/设置正在缓存的对象类型?
理想情况下,代码会显式地进行转换,但是目前 redis 中的缓存只使用对象类型(我认为)。
public object this[string key]
{
get
{
using (var redisClient = redisClientsManager.GetClient())
{
if (redisClient.HashContainsEntry(PiranhaHash, key))
{
string resultJson = redisClient.GetValueFromHash(PiranhaHash, key);
string objType = redisClient.GetValueFromHash(PiranhaHash, String.Format("{0}:Type", key));
Type t = JsonConvert.DeserializeObject<Type>(objType);
object result = JsonConvert.DeserializeObject(resultJson, t);
return result;
}
}
return null;
}
set
{
using (var redisClient = redisClientsManager.GetClient())
{
redisClient.SetEntryInHash(PiranhaHash, key, JsonConvert.SerializeObject(value));
redisClient.SetEntryInHash(PiranhaHash, String.Format("{0}:Type", key), JsonConvert.SerializeObject(value.GetType()));
}
}
}
在大多数情况下,此实现应该可以工作,但是 Page 对象不会正确地从 Json 反序列化,并且控制器将始终为空。我认为必须进行一些后端更改才能使这成为可能。