redis set 超时_解决redis修改数据导致过期时间清除的问题

今天写代码时遇到个需要更改 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"

参考

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值