2016-04-15 7 views
0

Ich habe Redis 2.8.19.In redis 2.8, wie Wert zu ändern und unberührte die TTL

In der folgenden Sequenz möchte ich, dass die ursprüngliche Ablaufzeit von 60 Sekunden nicht zurückgesetzt wird, wenn Sie den Wert mykey ändern.

127.0.0.1:6379[10]> SET mykey A EX 60 NX 
OK 
127.0.0.1:6379[10]> TTL mykey 
(integer) 53 
127.0.0.1:6379[10]> GETSET mykey B 
"A" 
127.0.0.1:6379[10]> TTL mykey 
(integer) -1 
127.0.0.1:6379[10]> GET mykey 
"B" 

Nach dem GETSET, würde ich erwarten, dass TTL mykey kehrt über 40 Sekunden statt -1.

Ist es möglich, den Wert zu ändern, ohne das Timeout zu verlieren oder zurückzusetzen?

Vielen Dank für einen Hinweis oder eine Lösung.

Antwort

2

Redis 'SET Befehl löscht die TTL des Schlüssels. Es gibt keinen Redis-Befehl, der es so behält, wie Sie es versuchen. Es ist jedoch möglich, ein Lua-Skript zu verwenden, das den Schlüssel gemäß Ihrer Anforderung setzt und ablöst. Das Skript würde wahrscheinlich wie folgt aussehen:

local ttl = redis.call('TTL',KEYS[1]) 
redis.call('SET',KEYS[1],ARGV[1]) 
redis.call('EXPIRE',KEYS[1],ttl) 
return "OK"` 

`

+0

Ihnen danken. Ich benutze Jedis, also habe ich ein ttl = jedis.ttl (...); jedis.set (Schlüssel, Wert, XX, EX, TTL). Ich würde sagen, ist fast atomar :) Dennoch wäre ein atomarer UPDATE-Schlüsselwert-Befehl willkommen (wenn er die TTL nicht modifiziert) :) – Costin

+0

Doing w/Jedis ist nicht atomar. Das obige Skript wird ausgeführt. Für Redis Lua mit Redis, hier ist ein netter Helfer: https://github.com/RedisLabs/luascript –

Verwandte Themen