Redis
 sql >> Base de données >  >> NoSQL >> Redis

Redis :pour définir le délai d'expiration d'une paire clé-valeur dans Set

Malheureusement non. Les "conteneurs" de Redis (c'est-à-dire les listes, les hachages, les ensembles et les ensembles triés) ne prennent pas en charge l'expiration par membre, bien que cette fonctionnalité ait été demandée à plusieurs reprises dans le passé.

Vous pouvez cependant implémenter votre propre logique pour obtenir ce résultat. Il existe plusieurs approches possibles pour résoudre ce problème - en voici un exemple. Au lieu d'utiliser un ensemble, utilisez un ensemble trié (ZSET) et définissez le score de chaque membre sur son heure d'expiration en utilisant des valeurs d'époque. Ce type de workflow pourrait être implémenté à l'aide d'un script Lua par exemple. Pour ajouter des membres, utilisez quelque chose comme :

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

et EVAL en utilisant '1 a 60 1' et '1 a 120 2' comme arguments, selon votre exemple. Pour "faire expirer" réellement les éléments de l'ensemble, vous devrez les supprimer une fois leur temps écoulé. Vous pouvez le faire soit en mettant en œuvre un processus périodique qui analyse votre liste, soit en y accédant. Par exemple, le Lua suivant peut être utilisé pour faire expirer des membres :

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

et EVAL en utilisant '1 a' comme arguments selon votre exemple.

EDIT :Comment réaliser ce qui précède en utilisant 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')