redis修改string的值而不修改过期时间

it2026-01-13  9

问题描述

在某些场景中,我们只需要修改redis的值,而不需要改变过期时间。 比如正在做的扫码登录。不了解扫码登录实现流程的可以百度一下。 第一步先生成一个uuid,存入redis,然后app扫码后,传入token,存到redis中,然后传给pc。 这里redis先存入一个key=uuid,value为空,然后超时时间为30秒。 app扫码后,需要更新value为token。 此时就遇到问题了 如果用set,则必然改变超时间。

解决方案一

很多人都会说,那不简单吗?封装一下,set前,先查询一下剩余时间,然后set后再次设置。 这样稍稍有些误差,但已经很小了。 方案是可行,但不够完美。

解决方案二

使用SETRANGE命令 用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。

>SET greeting "111111" "OK" >ttl greeting "-1" >EXPIRE greeting 30 "1" >ttl greeting "25" >SETRANGE greeting 0 "222222" "6" >GET greeting "222222" >ttl greeting "16"

但是注意,SETRANGE是偏移修改,你应该能想想到

redis> SET greeting "hello world" OK redis> SETRANGE greeting 6 "Redis" (integer) 11 redis> GET greeting "hello Redis"

上面的官方示例, **注意这只是部分覆盖,我上面的例子,第二次的内容一定是比初始值大的,所以没有问题。 假如第二次的内容比第一次小,那么SETRANGE后的值,并不是覆盖,是部分替换。 **

总结

方案二相对好一些,但也并不完美。目前完美的方法,官方并没有给出,大家可以讨论一下,有更好的方法,欢迎给我留言,谢谢!

最新回复(0)