Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Redis:para definir o tempo limite para um par de valores-chave em Set


Infelizmente não. Os "contêineres" do Redis (ou seja, listas, hashes, conjuntos e conjuntos classificados) não suportam a expiração por membro, embora essa funcionalidade tenha sido solicitada muitas vezes no passado.

Você pode, no entanto, implementar sua própria lógica para alcançar esse resultado. Existem várias abordagens possíveis para resolver isso - aqui está um exemplo. Em vez de usar um conjunto, use um conjunto classificado (ZSET) e defina a pontuação de cada membro para seu tempo de expiração usando valores de época. Esse tipo de fluxo de trabalho pode ser implementado usando um script Lua, por exemplo. Para adicionar membros, use algo como:
redis.call('zadd', KEYS[1], os.time()+ARGV[1], ARGV[2])

e EVAL usando '1 a 60 1' e '1 a 120 2' como argumentos, por seu exemplo. Para realmente "expirar" os itens do conjunto, você precisará excluí-los assim que o tempo passar. Você pode fazer isso implementando um processo periódico que verifica sua lista ou ao acessá-la. Por exemplo, o seguinte Lua pode ser usado para expirar membros:
redis.call('zremrangebyscore', KEYS[1], '-inf', os.time())

e EVAL usando '1 a' como argumentos pelo seu exemplo.

EDIT:Como conseguir o acima 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')