web-dev-qa-db-ja.com

TTLセットメンバーの場合

Redisでは、特定のキーではなく、セットのメンバーに対して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セットから対応するメンバーを削除する効率的な方法がわかりません。

私が思いついた1つの方法は、期限切れのキーを定期的にセットから削除するスクリプトを含むcronジョブを使用することです-すべてのタグ名を別のセットに追加し、すべてのタグを繰り返し、次に各タグに対応するすべてのIDをチェックし、対応するキーが存在します-存在しない場合は、SREMを呼び出します。

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

54
Przemek

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

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

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

Redis、セッションの有効期限、および逆引き

28
Didier Spezia

いいえ、これは不可能です(および どちらも計画されていません )。 推奨 アプローチは、タイムスタンプに設定されたスコアを持つ順序付けされたセットを使用し、期限切れのキーを手動で削除することです。有効期限が切れていないキーを照会するには、ZRANGEBYSCORE $now +infを使用して有効期限が切れたキーを削除します。ZREMRANGEBYSCORE -inf $nowがトリックを行います。

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

この記事 より詳細に説明します。

42
Václav Slavík

リスト内のアイテムを直接期限切れにすることはできませんが、luisスクリプトをredisサーバーに登録して、この機能をredisに追加することは可能です。 値に基づくRedis有効期限

0
Milad