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

Redis:Setでキーと値のペアのタイムアウトを設定するには

    残念だけど違う。 Redisの「コンテナ」(つまり、リスト、ハッシュ、セット、ソートされたセット)は、メンバーごとの有効期限をサポートしていませんが、この機能は過去に何度も要求されてきました。

    ただし、その結果を達成するために独自のロジックを実装することはできます。これに対処するためのいくつかの可能なアプローチがあります-ここに1つの例があります。セットを使用する代わりに、ソートされたセット(ZSET)を使用し、エポック値を使用して各メンバーのスコアを有効期限に設定します。このタイプのワークフローは、たとえばLuaスクリプトを使用して実装できます。メンバーを追加するには、次のように使用します:

    redis.call('zadd', KEYS[1], os.time()+ARGV[1], ARGV[2])
    

    例に従って、引数として「1 a601」と「1a1202」を使用してEVALします。セットからアイテムを実際に「期限切れ」にするには、時間が経過したらアイテムを削除する必要があります。これは、リストをスキャンする定期的なプロセスを実装するか、リストにアクセスすることで実行できます。たとえば、次のLuaを使用してメンバーを期限切れにすることができます。

    redis.call('zremrangebyscore', KEYS[1], '-inf', os.time())
    

    例に従って、引数として「1a」を使用してEVALします。

    編集:Pythonを使用して上記を達成する方法

    import time
    import redis
    
    def add(r, key, ttl, member):
        r.zadd(key, member, int(time.time()+ttl))
    
    def expire(r, key):
        r.zremrangebyscore(key, '-inf', int(time.time()))
    
    ...
    
    r = redis.Redis()
    add(r, 'a', 1, 60)
    add(r, 'a', 2, 120)
    
    # periodically or before every operation do
    expire(r, 'a')
    



    1. 配列ソースを使用してmongodbの配列サブセットを取得します

    2. コマンドラインからMongoDBデータベースを削除するにはどうすればよいですか?

    3. モンゴイドハッシュフィールドのクエリ

    4. ローカルでサブスクライブしているが、herokuではサブスクライブしていないアクションケーブル