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

キーの有効期限にソートされたセットを更新するRedis

    正解です。ソートされた設定値自体に「有効期限を設定」することはできません。

    ただし、メインキーを使用して、有効期限が発生したときにイベントをキャプチャすることができます。これを実現するには、少なくとも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を使用している理由ではない場合は申し訳ありませんが、今日インデックスを手動で管理する場合は、アプリケーションコードを大幅に簡素化できるため、確認する価値があると思います。




    1. redis.confのtcp-backlogとは

    2. モバイルまたはブラウザベースのアプリケーションからMongoDBを接続する

    3. cursor.forEach()で続行します

    4. 接続文字列を使用したmongodb認証