正解です。ソートされた設定値自体に「有効期限を設定」することはできません。
ただし、メインキーを使用して、有効期限が発生したときにイベントをキャプチャすることができます。これを実現するには、少なくとも2つの方法があります。
- キースペース通知の使用
- RedisGearsの使用
キースペース通知
キースペース通知を使用すると、PUBLISHメッセージを送信するEXPIREイベントをキャプチャして、消費することができます。
基本的な流れを説明しましょう:
通知の構成
CONFIG SET notify-keyspace-events Ex
- E :キーで発生するイベント
- x :期限切れのイベントをキャプチャする
これで、データベースは__key*__:*
でイベントを公開します チャネル。
したがって、これらのイベントをリッスンするサービスを構築して、セットを(直接的または間接的に)更新できます:
psubscribe __key*__:*
次の値と有効期限を設定するアプリケーションがある場合
set foo bar EX 5
次のメッセージが表示されます
1) "pmessage"
2) "__key*__:*"
3) "[email protected]__:expired"
4) "foo"
Redis Gears
Redis Gearsを使用すると、同じイベントをキャプチャできますが(通知にも基づいています)、Redisデータベースに直接コードを記述する方が簡単です。
Gearsは次のように作成できます:(これはPythonスクリプトであり、RedisInsightを使用してRedisにデプロイしています)
def process(x):
execute('LPUSH', 'expired:keys', x['value']['key']);
# Capture an expiration event and adds it to 'expired:events' stream
cap = GB('KeysReader')
cap.foreach(lambda x:
execute('XADD', 'expired:events', '*', 'key', x['key']))
cap.register(prefix='*',
mode='sync',
eventTypes=['expired'],
readValue=False)
# Consume new messages from expiration streams and process them somehow
proc = GB('StreamReader')
proc.foreach(process)
proc.register(prefix='expired:*',
batch=100,
duration=1,
trimStream = False)
cap = GB('KeysReader')
で始まるセクションを見てください
- これは、キーの有効期限をリッスンします
prefix='*'
&eventTypes=['expired']
- 有効期限が切れると、
'expired:events'
にメッセージが追加されます。 XADDコマンドを使用してStreamをRedisします - 次に、関数
proc = GB('StreamReader')
を確認します。 ストリームを処理します - 新しいメッセージがストリームに含まれるたびに、
process()
が呼び出されます。 機能。
この関数でソートされたセットを更新するロジックを追加できます。私の例では、期限切れのキーをリストに追加しました。
最初の質問から少し離れさせてください。
並べ替えセットを使用して、データの何らかの形式のインデックスを作成しているようです。
この場合は、ハッシュのインデックスを作成できる別のRedisモジュールであるRediSearchを確認する必要があります。 フィールドを選択し、インデックスを使用して高度なクエリと集計を実行します。
RediSearchを使用すると、インデックスを管理するためのコードを追加する必要がなく、データベースによって自動的に実行され、フィールドでクエリを実行できます。
ご覧ください:
- RediSearchモジュール
- RediSearch入門
これがSortedSetを使用している理由ではない場合は申し訳ありませんが、今日インデックスを手動で管理する場合は、アプリケーションコードを大幅に簡素化できるため、確認する価値があると思います。