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