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

Como definir a expiração da chave hash no redis de acordo com a existência da chave


Você NÃO PODE conseguir isso com o pipeline, pois você nunca sabe se a chave existe até que todo o pipeline tenha sido executado. Em vez disso, você pode usar o script Lua para fazer o trabalho:
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 isso para ver como executar o script Lua com redis-py. Em seguida, execute o script com pipeline para reduzir o RTT .

ATUALIZAÇÃO

Se você insistir em usar WATCH para fazer o trabalho, você pode tentar o seguinte 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