Vous NE POUVEZ PAS y parvenir avec pipeline, car vous ne savez jamais si la clé existe tant que l'ensemble du pipeline n'a pas été exécuté. Au lieu de cela, vous pouvez utiliser les scripts Lua pour faire le travail :
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
Cochez ceci pour voir comment exécuter le script Lua avec redis-py. Exécutez ensuite le script avec pipeline pour réduire le RTT
.
MISE À JOUR
Si vous insistez pour utiliser WATCH
pour faire le travail, vous pouvez essayer le code suivant :
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