Eliがリンクしている機能を使用すると、キーの有効期限が切れたときにリッスンできます。ただし、キーの値は提供されません。さらに、提出されたgithubの問題に基づくと、この機能がすぐに組み込まれることは期待できないようです(https://github.com/antirez/redis/issues/1876)。私が使用する解決策は、実際の値があるキーにリンクされた特別な「シャドウ」有効期限キーを作成することです。
したがって、testkey
というキーがあるとします。 整数値は100
です 。さらに、キーは10秒後に期限切れになり、その時点でキーの値を取得します。 (おそらく、キーが存在していた10秒間にキーをインクリメントしていました。)
まず、キースペースイベントのリッスンを設定する必要があります。特に、expired
をリッスンしたい イベント。これは、設定から行うか、config set
を使用して行うことができます redisのコマンド。 (詳細については、こちらを参照してください:http://redis.io/topics/notifications)
CONFIG SET notify-keyspace-events Ex
これで、特別なkeyevent
をサブスクライブできます。 キーの有効期限が切れたことが通知されるチャネル。
SUBSCRIBE [email protected]__:expired
サブスクライブするチャネルの形式は、[email protected]<db>__:<eventName>
です。 。この例では、デフォルトのデータベース0を使用していて、expired
をリッスンしたいと想定しています。 イベント。
testkey
有効期限が切れると、__keyevent__
にメッセージが表示されます メッセージが期限切れになったキーの名前であるチャネル。もちろん、この時点でキーがなくなったため、値にアクセスできなくなります。解決策は、特別な有効期限キーを使用することです。
testkey
を作成するとき また、有効期限が切れる特別な「シャドウ」キーを作成します(実際のtestkey
を有効期限が切れないようにしてください )。例:
SET testkey 100
SET shadowkey:testkey "" EX 10
[email protected]__:expired
にあります チャンネルには、キーshadowkey:testkey
であることを通知するメッセージが表示されます 期限切れ。メッセージの値(キーの名前)を取得し、コロン(または使用することを決定したセパレーター)で分割してから、キーの値を手動で取得して削除します。
// set your key value
SET testkey 100
//set your "shadow" key, note the value here is irrelevant
SET shadowkey:testkey "" EX 10
// Get an expiration message in the channel [email protected]__:expired
// Split the key on ":", take the second part to get your original key
// Then get the value and do whatever with it
GET testkey
// Then delete the key
DEL testkey
シャドウキーの値は使用されないため、この回答(値のないRedisストアキー)によると空の文字列である可能な限り最小の値を使用することに注意してください""
。セットアップにはもう少し手間がかかりますが、上記のシステムはまさに必要なことを実行します。オーバーヘッドは、実際にキーを取得および削除するためのいくつかの追加コマンドと、空のキーのストレージコストです。