Redis
 sql >> Datenbank >  >> NoSQL >> Redis

So legen Sie den Ablauf des Hash-Schlüssels in Redis entsprechend der Existenz des Schlüssels fest

Mit der Pipeline können Sie das NICHT erreichen, da Sie nie wissen, ob der Schlüssel existiert, bis die gesamte Pipeline ausgeführt wurde. Stattdessen können Sie Lua-Scripting verwenden, um die Arbeit zu erledigen:

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

Überprüfen Sie dies, um zu sehen, wie Sie das Lua-Skript mit redis-py ausführen. Führen Sie dann das Skript mit der Pipeline aus, um die RTT zu reduzieren .

AKTUALISIEREN

Wenn Sie darauf bestehen, WATCH zu verwenden Um die Aufgabe zu erledigen, können Sie den folgenden Code ausprobieren:

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