Redis之Key過期策略的用法解讀
一、什么是 Key 的過期策略?
在 Redis 中,Key 的過期策略是指管理鍵生命周期的機(jī)制。通過設(shè)置過期時(shí)間(TTL - Time To Live),Redis 能夠自動(dòng)刪除那些已經(jīng)過期的鍵,從而釋放內(nèi)存空間。
這對(duì)于緩存場(chǎng)景尤為重要,因?yàn)樗_保了數(shù)據(jù)不會(huì)永久性地占用內(nèi)存,同時(shí)保持了系統(tǒng)的高效運(yùn)行。
二、過期策略的核心概念
生存時(shí)間(TTL):
- TTL 表示一個(gè)鍵在 Redis 中存活的時(shí)間長度。
- 可以通過
EXPIRE
和PXPIRE
命令分別以秒和毫秒為單位設(shè)置 TTL。
過期時(shí)間戳(Expiry Timestamp):
- 每個(gè)帶有過期時(shí)間的鍵都會(huì)被賦予一個(gè)具體的過期時(shí)間戳,表示該鍵將在何時(shí)失效。
EXPIREAT
和PEXPIREAT
命令分別以秒和毫秒為單位設(shè)置過期時(shí)間戳。
三、過期鍵的刪除策略
Redis 提供了兩種主要的策略來處理過期的鍵:
惰性刪除(Lazy Deletion)
工作原理:
- 當(dāng)一個(gè)鍵過期后,并不會(huì)立即被刪除。
- 只有在下一次訪問該鍵時(shí),Redis 才會(huì)檢查其是否已過期。
- 如果已經(jīng)過期,則該鍵會(huì)被刪除。
優(yōu)點(diǎn):
- 減少了 CPU 和內(nèi)存的使用,因?yàn)椴恍枰l繁掃描和刪除過期鍵。
- 適用于對(duì)延遲不敏感的應(yīng)用場(chǎng)景。
缺點(diǎn):
- 過期鍵可能會(huì)在內(nèi)存中存在較長時(shí)間
- 占用不必要的空間
積極刪除(Active Deletion)
工作原理:
- Redis 定期運(yùn)行后臺(tái)任務(wù),主動(dòng)掃描并刪除已經(jīng)過期的鍵。
- 這種策略確保了內(nèi)存不會(huì)被過多的過期鍵占用。
優(yōu)點(diǎn):
- 及時(shí)釋放內(nèi)存空間,避免過期鍵堆積影響系統(tǒng)性能。
- 適用于高并發(fā)和對(duì)延遲敏感的應(yīng)用場(chǎng)景。
缺點(diǎn):
- 增加了 CPU 的負(fù)載
- 因?yàn)楹笈_(tái)掃描任務(wù)需要一定的計(jì)算資源
四、設(shè)置過期時(shí)間的命令
Redis 提供了多種命令來設(shè)置鍵的過期時(shí)間:
EXPIRE key seconds
:
- 以秒為單位設(shè)置鍵
key
的生存時(shí)間。 - 示例:
EXPIRE myKey 3600
表示myKey
在 3600 秒后過期。
PXPIRE key milliseconds
:
- 以毫秒為單位設(shè)置鍵
key
的生存時(shí)間,提供了更高的精度。 - 示例:
PXPIRE myKey 1800000
表示myKey
在 1,800,000 毫秒(即 30 分鐘)后過期。
EXPIREAT key timestamp
:
- 設(shè)置鍵
key
的過期時(shí)間為指定的 Unix 時(shí)間戳(以秒為單位)。 - 示例:
EXPIREAT myKey 1728000000
表示myKey
將在時(shí)間戳 1,728,000,000 對(duì)應(yīng)的時(shí)間點(diǎn)過期。
PEXPIREAT key timestamp
:
- 設(shè)置鍵
key
的過期時(shí)間為指定的 Unix 時(shí)間戳(以毫秒為單位)。 - 示例:
PEXPIREAT myKey 1728000000000
表示myKey
將在時(shí)間戳 1,728,000,000,000 對(duì)應(yīng)的時(shí)間點(diǎn)過期。
五、查詢剩余生存時(shí)間
Redis 提供了兩個(gè)命令來查詢鍵的剩余生存時(shí)間:
TTL key
:
- 返回以秒為單位的鍵
key
的剩余生存時(shí)間。 - 示例:
TTL myKey
可能返回300
,表示該鍵還有 300 秒未過期。
PTTL key
:
- 返回以毫秒為單位的鍵
key
的剩余生存時(shí)間。 - 示例:
PTTL myKey
可能返回180000
,表示該鍵還有 180,000 毫秒(即 3 分鐘)未過期。
六、批量設(shè)置和處理
在實(shí)際應(yīng)用中,可能需要對(duì)多個(gè)鍵進(jìn)行批量的過期時(shí)間設(shè)置或管理。為此,可以結(jié)合使用 Redis 的管道(Pipeline)功能來提高操作效率:
管道(Pipeline):
將多個(gè)命令一次性發(fā)送給 Redis 服務(wù)器,減少網(wǎng)絡(luò)往返次數(shù),提升性能。
示例:
import redis r = redis.Redis(host='localhost', port=6379, db=0) pipe = r.pipeline() # 批量設(shè)置過期時(shí)間 pipe.expire('key1', 3600) pipe.expire('key2', 3600) pipe.expire('key3', 3600) # 執(zhí)行管道中的命令 pipe.execute()
七、選擇合適的刪除策略
在實(shí)際應(yīng)用中,應(yīng)根據(jù)具體需求和系統(tǒng)負(fù)載情況來選擇過期鍵的刪除策略:
惰性刪除:
- 適用于對(duì)延遲不敏感、內(nèi)存資源較為充足的場(chǎng)景。
- 可以通過調(diào)整
maxmemory
和maxmemory-policy
來優(yōu)化內(nèi)存使用。
積極刪除:
- 適用于高并發(fā)、需要快速響應(yīng)的應(yīng)用場(chǎng)景。
- 需要注意的是,積極刪除會(huì)增加 CPU 的負(fù)載,因此在配置時(shí)應(yīng)權(quán)衡系統(tǒng)資源的使用情況。
八、注意事項(xiàng)
過期時(shí)間的精度:
- 使用
PXPIRE
和PEXPIREAT
命令可以設(shè)置更精確的過期時(shí)間,適用于需要嚴(yán)格控制時(shí)間的應(yīng)用場(chǎng)景。
鍵不存在時(shí)的行為:
- 如果嘗試對(duì)一個(gè)不存在的鍵設(shè)置過期時(shí)間,Redis 會(huì)返回錯(cuò)誤。
- 因此,在操作前應(yīng)確保鍵的存在性,或使用
SET
等命令同時(shí)設(shè)置值和過期時(shí)間。
內(nèi)存管理:
- 過期鍵不會(huì)立即被刪除,而是會(huì)在一定時(shí)間內(nèi)被 Redis 的后臺(tái)任務(wù)清理。
- 為了避免內(nèi)存不足的問題,建議合理配置
maxmemory
和選擇合適的內(nèi)存淘汰策略。
總結(jié)
Redis 提供了靈活的過期時(shí)間設(shè)置和多種刪除策略,能夠滿足不同應(yīng)用場(chǎng)景的需求。
在實(shí)際使用中,應(yīng)根據(jù)系統(tǒng)的負(fù)載情況和應(yīng)用的特點(diǎn)來選擇合適的命令和策略,以優(yōu)化性能和資源利用率。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
redis客戶端連接錯(cuò)誤 NOAUTH Authentication required
本文主要介紹了redis客戶端連接錯(cuò)誤 NOAUTH Authentication required,詳細(xì)的介紹了解決方法,感興趣的可以了解一下2021-07-07如何使用注解方式實(shí)現(xiàn)?Redis?分布式鎖
這篇文章主要介紹了如何使用注解方式實(shí)現(xiàn)Redis分布式鎖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,教大家如何優(yōu)雅的使用Redis分布式鎖,感興趣的小伙伴可以參考一下2022-07-07redis?手機(jī)驗(yàn)證碼實(shí)現(xiàn)示例
本文主要介紹了redis?手機(jī)驗(yàn)證碼實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Redis Cluster集群收縮主從節(jié)點(diǎn)詳細(xì)教程
集群收縮的源端就是要下線的主節(jié)點(diǎn),目標(biāo)端就是在線的主節(jié)點(diǎn),這篇文章主要介紹了Redis Cluster集群收縮主從節(jié)點(diǎn)詳細(xì)教程,需要的朋友可以參考下2021-11-11Redis發(fā)布訂閱和實(shí)現(xiàn).NET客戶端詳解
發(fā)布訂閱在應(yīng)用級(jí)其作用是為了減少依賴關(guān)系,通常也叫觀察者模式。主要是把耦合點(diǎn)單獨(dú)抽離出來作為第三方,隔離易變化的發(fā)送方和接收方。下面這篇文章主要給大家介紹了關(guān)于Redis發(fā)布訂閱和實(shí)現(xiàn).NET客戶端的相關(guān)資料,需要的朋友可以參考下2017-03-03