今天寫代碼時(shí)遇到個(gè)需要更改 redis 的值蒿赢,但不更改過期時(shí)間的需求涤妒。
一開始直接使用 set 修改颁督,發(fā)現(xiàn)過期時(shí)間消失践啄,值直接持久化了。
查了下資料:
- 如果用SET, GETSET會(huì)將key對(duì)應(yīng)存儲(chǔ)的值替換成新的沉御,也會(huì)清除掉超時(shí)時(shí)間屿讽,變成持久化的;
- 如果list結(jié)構(gòu)中添加一個(gè)數(shù)據(jù)或者改變hset數(shù)據(jù)的一個(gè)字段是不會(huì)清除超時(shí)時(shí)間的;
INCR/LPUSH/HSET等命令則不會(huì)清除過期時(shí)間
在使用INCR/LPUSH/HSET這種只是修改一個(gè)key的value伐谈,而不是覆蓋整個(gè)value的命令烂完,則不會(huì)清除key的過期時(shí)間。 - 如果想要通過set去覆蓋值那就必須重新設(shè)置expire诵棵。
首先想到先獲取過期時(shí)間抠蚣,然后 set 時(shí)指定過期時(shí)間,但這樣畢竟要兩次請(qǐng)求履澳,還有一種解決方案嘶窄,使用 setrange 命令
setrange命令
Redis Setrange 命令用指定的字符串覆蓋給定 key 所儲(chǔ)存的字符串值,覆蓋的位置從偏移量 offset 開始距贷。
這個(gè)命令是覆寫值柄冲,不會(huì)更改過期時(shí)間。
命令基本語法
redis 127.0.0.1:6379> SETRANGE KEY_NAME OFFSET VALUE
返回被修改后的字符串長度储耐。
實(shí)例
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"
我們?cè)谑褂脮r(shí)可以指定 offset 從零開始羊初,就是從字符串第一個(gè)位置開始覆寫,但注意新值的長度要 >= offset 處往后的字符長度什湘,否則就會(huì)出現(xiàn)沒有完全覆寫的情況:
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