我正在尝试编写一个通用类/接口,该类/接口将从Redis缓存中获取数据。我试图使其通用,因为我们拥有不同类型的数据,并且很难为每种数据类型编写这么多的类。
这是我的界面和类。
public interface IRedisCache<T>
{
Task<T> GetValue(string code);
}
public class RedisCache<T> : IRedisCache<T>
{
public RedisCache()
{
}
public Task<T> GetValue(string code)
{
var cache = RedisConnectorHelper.Connection.GetDatabase();
var value = cache.StringGet($"Device_Status:{code}");
Task<T> myTask = (Task<T>)value;
return myTask;
}
}
我正遇到以下问题:
Task<T> myTask = (Task<T>)value;
问题在于将Redis.RedisValue类型转换为Task<T>
类型。
我收到错误消息
“无法将
Redis.Redisvalue
类型转换为System.Threading.Tasks.Task<T>
”
我正在使用带有点网核心2的Stack Exchange.Redis库。
答案 0 :(得分:2)
假设该值最初以JSON形式存储在缓存中,
cache.StringSet($"Device_Status:{code}", JsonConvert.SerializeObject(myObject)));
然后只需将返回值反序列化为所需的类型
public async Task<T> GetValue(string code) {
var cache = RedisConnectorHelper.Connection.GetDatabase();
var value = await cache.StringGetAsync($"Device_Status:{code}");
T resultFromCache = JsonConvert.DeserializeObject<T>(value);
return resultFromCache;
}
我建议将缓存服务重构为
public interface IRedisCache {
Task<T> GetValue<T>(string code);
}
使用上述建议实施
public class RedisCache : IRedisCache {
public async Task<T> GetValue<T>(string code) {
var cache = RedisConnectorHelper.Connection.GetDatabase();
var value = await cache.StringGetAsync($"Device_Status:{code}");
T resultFromCache = JsonConvert.DeserializeObject<T>(value);
return resultFromCache;
}
}