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

redispythonでのキーの有効期限の通知

    サプライズ(キーの存続時間がゼロに達したときに期限切れイベントは表示されません)はPythonにバインドされていませんが、Redisがキーを期限切れにしています。

    期限切れのイベントのタイミングに関するRedisドキュメント

    期限切れのイベントのタイミング

    有効期間が関連付けられているキーは、Redisによって次の2つの方法で期限切れになります。

    • コマンドによってキーにアクセスされ、有効期限が切れていることが判明した場合。
    • アクセスされないキーも収集できるようにするために、バックグラウンドで期限切れのキーを段階的に検索するバックグラウンドシステムを介して。

    期限切れのイベントは、キーがアクセスされ、上記のシステムのいずれかによって期限切れになっていることが判明したときに生成されます。その結果、Redisサーバーがキーの存続時間に期限切れのイベントを生成できるという保証はありません。ゼロの値に達します。

    キーを常に対象とするコマンドがなく、TTLが関連付けられているキーが多数ある場合、キーの存続時間がゼロになってから期限切れのイベントが生成されるまでに大幅な遅延が発生する可能性があります。

    基本的に期限切れのイベントは、Redisサーバーがキーを削除したときに生成されます 理論的には存続時間がゼロの値に達したときではありません。

    コンソールでの小規模なテスト

    Redisの実行時($ sudo service redis-server start

    1台のコンソールを起動し、サブスクライブしました:

    $ redis-cli
    PSUBSCRIBE "__key*__:*"
    

    次に、別のコンソールで:

    $ redis-cli
    > config set notify-keyspace-events AKE
    

    あらゆる種類のイベントを購読するもの

    次に、この2番目のコンソールで実験を続けました:

    > set aaa aaa
    > del aaa
    > set aaa ex 5
    > get aaa
    

    すべてのアクティビティは、サブスクライブされたコンソールで表示されました。キーの有効期限だけが数秒遅れて、ちょうど間に合ったのです。

    また、メッセージには微妙な違いがあります。1つのメッセージ [email protected]__:expire 別の[email protected]__:expired

    サンプルリスナーspy.py

    import redis
    import time
    
    r = redis.StrictRedis()
    pubsub = r.pubsub()
    pubsub.psubscribe("*")
    for msg in pubsub.listen():
        print time.time(), msg
    

    このコードは、デフォルトのredisで既存のすべてのチャネルに登録され、公開されたものはすべて印刷されます。

    実行する:

    $ python spy.py
    

    別のコンソールで、有効期限のあるキーを設定してみてください。すべてのイベントが表示されます。

    次のredis-cli入力用。

    $ redis-cli
    127.0.0.1:6379> set a aha
    OK
    127.0.0.1:6379> set b bebe ex 3
    OK
    127.0.0.1:6379> set b bebe ex 3
    OK
    

    スパイ出力を取得します:

    1401548400.27 {'pattern': None, 'type': 'psubscribe', 'channel': '*', 'data': 1L}
    1401548428.36 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:a', 'data': 'set'}
    1401548428.36 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:set', 'data': 'a'}
    1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'set'}
    1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:set', 'data': 'b'}
    1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'expire'}
    1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:expire', 'data': 'b'}
    1401548439.82 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'expired'}
    1401548439.82 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:expired', 'data': 'b'}
    1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'set'}
    1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:set', 'data': 'b'}
    1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'expire'}
    1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:expire', 'data': 'b'}
    1401548487.51 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'expired'}
    1401548487.51 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:expired', 'data': 'b'}
    



    1. Mongodbで使用されているキャッシュを解放する方法は?

    2. MongoDB-Javaドライバーを使用して配列からエントリを削除します

    3. StackExchange.Redisを使用したRedisへのSSL接続

    4. $match内のmongodb集計クエリで$regexを使用する方法