过期的TypedClient对象仍然以redis形式保留主集

时间:2014-02-19 12:33:23

标签: servicestack.redis

想象一些类似下面的代码......

using (var transaction = this.redisClient.CreateTransaction())
{
    transaction.QueueCommand(client => client.As<MyPoco>().StoreAsHash(myPocoInstance));
    transaction.QueueCommand(client => client.As<MyPoco>().ExpireAt(id, timeout));

    transaction.Commit();
}

我将myPoco存储为redis中的哈希值。在这个阶段,如果你看看redis中的所有键,那么你会看到类似的东西......

ids:MyPoco
urn:mypoco:12345

即。 urn:mypoco:12345 包含存储为哈希的myPocoInstance和 ID:MyPoco 包含一组指向存储在redis中的MyPoco实例的指针(此时单个值12345)。这一切都很好,直到到期为止。一旦 urn:mypoco:12345 到期,那么哈希从redis中消失,这很好,但 ids:MyPoco 永远不会得到更新,以反映12345条目现在已经消失。因此,随着时间的推移, ID:MyPoco 将继续增长。

这有什么办法吗? 在我看来,使用TypedClients到期可能不是一个好主意。我可以看到解决这个问题的唯一方法是不使用哈希,而只是将poco上的所有单个字段存储为单独的redis条目 - 但这并不理想。

我希望我错过了一些明显的东西。

1 个答案:

答案 0 :(得分:0)

redis中的密钥到期在服务器上静默发生,即没有回调可以注册以清理任何相关的引用,这就是为什么你应该避免使内部索引中引用的任何实体到​​期,除非你提供你的自己的解决方案,定期重建和清理索引,例如:

var redis = (RedisClient)redisManager.GetClient();
var redisPocos = redis.As<MyPoco>();
var allPocos = redisPocos.GetAll();
redis.RemoveEntry(redis.GetTypeIdsSetKey<MyPoco>()); //remove ids:MyPoco set
redisPocos.StoreAll(allPocos); //recreate entities and index