我正在尝试使用 ServiceStack.Redis 客户端从 memcached 移动到 redis。我希望能够简单地检查 Redis 缓存是否有键的项目,如果没有,则使用过期超时添加它们。然后稍后检索它们(如果它们存在)。
为了测试这一点,我创建了一个简单的 ASP.NET WebApi 项目并使用这两种方法修改了 ValuesController。
public class ValuesController : ApiController
{
public IEnumerable<string> Get()
{
using (var redisClient = new RedisClient("localhost"))
{
IRedisTypedClient<IEnumerable<SampleEvent>> redis = redisClient.As<IEnumerable<SampleEvent>>();
if (!redis.ContainsKey("urn:medications:25"))
{
var medsWithID25 = new List<SampleEvent>();
medsWithID25.Add(new SampleEvent() { ID = 1, EntityID = "25", Name = "Digoxin" });
medsWithID25.Add(new SampleEvent() { ID = 2, EntityID = "25", Name = "Aspirin" });
redis.SetEntry("urn:medications:25", medsWithID25);
redis.ExpireIn("urn:medications:25", TimeSpan.FromSeconds(30));
}
}
return new string[] { "1", "2" };
}
public SampleEvent Get(int id)
{
using (var redisClient = new RedisClient("localhost"))
{
IRedisTypedClient<IEnumerable<SampleEvent>> redis = redisClient.As<IEnumerable<SampleEvent>>();
IEnumerable<SampleEvent> events = redis.GetById("urn:medications:25");
if (events != null)
{
return events.Where(m => m.ID == id).SingleOrDefault();
}
else
return null;
}
}
}
这似乎不起作用。redis.GetById 总是返回 null。我究竟做错了什么?
谢谢。
更新 1:
如果我将获取数据的行更改为:
IEnumerable<SampleEvent> events = redis.GetValue("urn:medications:25");
然后我取回我的对象,但即使在超时之后也应该删除它。