今天写代码时遇到个需要更改 redis 的值,但不更改过期时间的需求。
一开始直接使用 set 修改,发现过期时间消失,值直接持久化了。
查了下资料:
- 如果用SET, GETSET会将key对应存储的值替换成新的,也会清除掉超时时间,变成持久化的;
- 如果list结构中添加一个数据或者改变hset数据的一个字段是不会清除超时时间的;
INCR/LPUSH/HSET等命令则不会清除过期时间
在使用INCR/LPUSH/HSET这种只是修改一个key的value,而不是覆盖整个value的命令,则不会清除key的过期时间。 - 如果想要通过set去覆盖值那就必须重新设置expire。
首先想到先获取过期时间,然后 set 时指定过期时间,但这样毕竟要两次请求,还有一种解决方案,使用 setrange 命令
setrange命令
Redis Setrange 命令用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始。
这个命令是覆写值,不会更改过期时间。
命令基本语法
redis 127.0.0.1:6379> SETRANGE KEY_NAME OFFSET VALUE
返回被修改后的字符串长度。
实例
redis 127.0.0.1:6379> SET key1 "Hello World"
OK
redis 127.0.0.1:6379> SETRANGE key1 6 "Redis"
(integer) 11
redis 127.0.0.1:6379> GET key1
"Hello Redis"
我们在使用时可以指定 offset 从零开始,就是从字符串第一个位置开始覆写,但注意新值的长度要 >= offset 处往后的字符长度,否则就会出现没有完全覆写的情况:
redis 127.0.0.1:6379> SET key1 "Hello World"
OK
redis 127.0.0.1:6379> SETRANGE key1 6 "abc"
(integer) 11
redis 127.0.0.1:6379> GET key1
"Hello abcld"
参考
https://www.redis.net.cn/order/3553.html
https://juejin.im/post/5d6bda096fb9a06acc009dc8