НЕ МОЖЕТЕ да постигнете това с конвейер, тъй като никога не знаете дали ключът съществува, докато не бъде изпълнен целият конвейер. Вместо това можете да използвате Lua скриптове, за да свършите работата:
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
Проверете това, за да видите как да стартирате Lua скрипт с redis-py. След това стартирайте скрипта с конвейер, за да намалите RTT
.
АКТУАЛИЗИРАНЕ
Ако настоявате да използвате WATCH
за да свършите работата, можете да опитате следния код:
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