sql >> Base de Datos >  >> NoSQL >> Redis

Redis:para establecer el tiempo de espera para un par de valores clave en Set

Lamentablemente no. Los "contenedores" de Redis (es decir, listas, hashes, conjuntos y conjuntos ordenados) no admiten la caducidad por miembro, aunque esta funcionalidad se ha solicitado muchas veces en el pasado.

Sin embargo, puede implementar su propia lógica para lograr ese resultado. Hay varios enfoques posibles para abordar esto:aquí hay un ejemplo. En lugar de usar un conjunto, use un conjunto ordenado (ZSET) y establezca la puntuación de cada miembro en su tiempo de vencimiento usando valores de época. Este tipo de flujo de trabajo podría implementarse mediante un script Lua, por ejemplo. Para agregar miembros, use algo como:

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

y EVALÚE usando '1 a 60 1' y '1 a 120 2' como argumentos, según su ejemplo. Para "caducar" realmente los elementos del conjunto, deberá eliminarlos una vez que haya transcurrido su tiempo. Puede hacerlo implementando un proceso periódico que escanea su lista o al acceder a ella. Por ejemplo, el siguiente Lua se puede usar para hacer caducar a los miembros:

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

y EVALÚE usando '1 a' como argumentos según su ejemplo.

EDITAR:Cómo lograr lo anterior usando 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')