解决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"

参考

https://www.redis.net.cn/order/3553.html
https://juejin.im/post/5d6bda096fb9a06acc009dc8

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • redis是一个以key-value存储的非关系型数据库。有五种数据类型,string、hashes、list、s...
    林ze宏阅读 1,022评论 0 0
  • 1 Redis介绍1.1 什么是NoSql为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方...
    克鲁德李阅读 5,354评论 0 36
  • 一、Redis基础概述Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用...
    土卡拉阅读 240评论 0 0
  • 一、Redis基础 概述Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应...
    EndEvent阅读 1,151评论 0 7
  • 一、Redis基础 概述Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应...
    陈small末阅读 607评论 0 0