2016-04-15 6 views
0

私はRedis 2.8.19を持っています。Redis 2.8では、値を変更してTTLを維持する方法

以下のシーケンスでは、mykeyの値を変更するときに元の有効期限60秒がリセットされないようにしたいと考えています。

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" 

GETSETした後、私が持っているでしょうがTTL mykeyではなく-140秒を返すことを期待しています。

タイムアウトを失うこともリセットすることなく値を変更することは可能ですか?

ありがとうございました。

答えて

2

Redis 'SETコマンドは、キーのTTLをクリアします。あなたがしようとしているようにそれを保持するレディスコマンドはありません。しかし、あなたの要件ごとに鍵を設定して期限切れにするLuaスクリプトを使うことは可能です。次のようにスクリプトは、おそらくになります。

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

`

+0

はあなたに感謝します。私はjedisを使っているので、私はttl = jedis.ttl(...)をやった。 jedis.set(key、value、XX、EX、ttl)私はほとんど原子だと言うだろう:)しかし、それはTTLを変更しない場合は原子のUPDATEキー値のコマンドは歓迎される:)) – Costin

+0

それを行う/ジェダイは原子的ではありません。上記のスクリプトの実行は次のとおりです。 RedisでRedis Luaを実行するには、ここで素晴らしいヘルパーがあります:https://github.com/RedisLabs/luascript –

関連する問題