Bạn KHÔNG THỂ đạt được điều đó với đường ống, vì bạn không bao giờ biết liệu khóa có tồn tại hay không cho đến khi toàn bộ đường dẫn được thực thi. Thay vào đó, bạn có thể sử dụng Lua scripting để thực hiện công việc:
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
Kiểm tra phần này để biết cách chạy tập lệnh Lua với redis-py. Sau đó, chạy tập lệnh với đường dẫn để giảm RTT
.
CẬP NHẬT
Nếu bạn khăng khăng sử dụng WATCH
để thực hiện công việc, bạn có thể thử mã sau:
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