Redis
 sql >> Base de données >  >> NoSQL >> Redis

Comment définir l'expiration de la clé de hachage dans redis en fonction de l'existence de la clé

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