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

Cómo configurar la caducidad de la clave hash en redis según la existencia de la clave

NO PUEDE lograr eso con la tubería, ya que nunca sabe si la clave existe hasta que se haya ejecutado toda la tubería. En su lugar, puede usar secuencias de comandos de Lua para hacer el trabajo:

local key = KEYS[1]
local field = ARGV[1]
local value = ARGV[2]
local ttl = ARGV[3]

local exist = redis.call('exists', key)

redis.call('hset', key, field, value)

if exist == 0 then
    redis.call('expire', key, ttl)
end

Verifique esto para ver cómo ejecutar el script Lua con redis-py. Luego ejecute la secuencia de comandos con canalización para reducir el RTT .

ACTUALIZAR

Si insiste en usar WATCH para hacer el trabajo, puede probar el siguiente código:

with r.pipeline() as pipe:
    while 1:
        try:
            pipe.watch(hkey)

            exist = pipe.exists(hkey)

            pipe.multi()

            if not exist:
                pipe.hset(hkey, v, v)
                pipe.expire(hkey, 3600)
            else:
                pipe.hset(hkey, v, v)

            pipe.execute()
            break;
        except WatchError:
            continue