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 に答える