我有Redis 2.8.19。
在下面的序列中,我希望在修改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
返回大约40
秒,而不是-1
。
是否可以在不丢失或重置超时的情况下修改值
感谢您的任何提示或解决方案。
Redis的SET
命令清除密钥的TTL。没有Redis命令可以像你试图做的那样保留它。但是,可以使用Lua脚本,根据你的要求设置和过期密钥。脚本可能如下所示:
local ttl = redis.call('TTL',KEYS[1])
redis.call('SET',KEYS[1],ARGV[1])
redis.call('EXPIRE',KEYS[1],ttl)
return "OK"`
`
SET命令现在有一个名为keepttl
的选项。来自文档:
KEETTL—保留与密钥相关联的生存时间。
GETSET仍然不支持,但是,嘿,进步!
在使用简单计数器的情况下,这可以通过使用INCR/INCRBY和DECR/DECRBY命令来实现。它们将分别递增和递减计数器,并保持TTL值不变。