sql >> データベース >  >> NoSQL >> Redis

Redis通知:有効期限が切れたときにキーと値を取得する

    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ストアキー)によると空の文字列である可能な限り最小の値を使用することに注意してください"" 。セットアップにはもう少し手間がかかりますが、上記のシステムはまさに必要なことを実行します。オーバーヘッドは、実際にキーを取得および削除するためのいくつかの追加コマンドと、空のキーのストレージコストです。



    1. ツイスト:遅延コールバックを遅延スレッドに渡すと、スレッドが突然ブロックされるのはなぜですか?

    2. バックグラウンドでredis-serverをノンストップで実行したい

    3. C#ドライバーを使用してMongoDBで複数のドキュメントを更新およびアップサートする方法

    4. ソートされたオブジェクトのセットをredisに保存するにはどうすればよいですか?