2013-06-12 14 views
37

Redisでは、特定のキーではなく、セットのメンバーのTTL(有効期間)を設定できますか?セットメンバーのTTL

Redisのドキュメントで提案されているタグの構造を使用しています。データは単純なキーと値のペアであり、タグは各タグに対応するキーを含むセットです。予想通り

> SETEX id:id_1 100 'Lorem ipsum' 
OK 
> SADD tag:tag_1 id:id_1 
(integer) 1 

キーid:id_1が期限切れになりますが、私はtag:tag_1セットから対応するメンバを削除するための効率的な方法が表示されません。

私は、cronジョブを使用して、期限切れのキーを定期的に削除するスクリプトを使用しています。すべてのタグ名を別のセットに追加してから、すべてのタグを繰り返した後、それぞれに対応するすべてのID対応するキーが存在するかどうかをチェックし、存在しない場合はSREMを呼び出します。

私はそれが効率的な方法ではないと思うし、おそらく複数のタグ(SINTER)で検索のパフォーマンスに影響するセットのサイズは、可能な限りクリーンなタグを保持したいと思います。もっと「内部」的な方法がありますか?

答えて

15

リスト、セット、またはセットのアイテムを期限切れにすることはできません。

マスターアイテムが期限切れになったときに通知されるメカニズムを実装する必要があります。これにより、対応するセットを適切に維持することができます。

はこの質問への答えを参照してください、私は(idでセッションを交換し、タグによってユーザー)それはあなたのユースケースに適用されると思う:

Redis, session expiration, and reverse lookup

+0

はい、まともなやり方で、私はおそらく同様の問題を扱います。タグセット内の有効期限の切れたメンバーの存在は、パフォーマンス以外の方法では問題にならないため、デーモンの定期的に実行されるcron isteadを使用して、ポーリングを十分に最小限に制限します。 – Przemek

20

いいえ、これは可能ではない(とnot planned either )。 recommendedのアプローチでは、タイムスタンプにスコアを設定した順序付きセットを使用し、期限切れのキーを手動で削除します。期限切れでないキーを照会するには、ZRANGEBYSCORE $now +infを使用して期限切れのキーを削除することができます。ZREMRANGEBYSCORE -inf $nowはそのトリックを行います。

私のアプリケーションでは、私はセットを照会するたびに両方のコマンドを発行するだけです。私はまた、これを(長い)有効期限と組み合わせて、最終的に未使用のセットをパージします。

This articleを詳しく説明します。