0

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

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,ids:MyPoco包含一组指向存储在 redis 中的 MyPoco 的每个实例的指针(此时单个值 12345)。这一切都很好,直到到期开始。一旦urn:mypoco:12345到期,那么哈希就会从 redis 中消失,这很好,但是ids:MyPoco将永远不会更新以反映 12345 条目现在已经消失了。因此,随着时间的推移,ids:MyPoco将继续增长。

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

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

4

1 回答 1

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
于 2014-11-06T16:26:50.830 回答