Redis 的過(guò)期策略與鍵的過(guò)期時(shí)間設(shè)置方法
Redis 是一個(gè)高性能的鍵值存儲(chǔ)系統(tǒng),廣泛應(yīng)用于緩存、消息隊(duì)列等場(chǎng)景。為了管理內(nèi)存資源,Redis 提供了鍵的過(guò)期機(jī)制,允許用戶為鍵設(shè)置生存時(shí)間(TTL)。本文將深入探討 Redis 的過(guò)期策略、如何設(shè)置鍵的過(guò)期時(shí)間,以及這些機(jī)制背后的實(shí)現(xiàn)原理。
一、 Redis 的過(guò)期策略
Redis 通過(guò)兩種主要策略來(lái)處理鍵的過(guò)期問(wèn)題:?惰性刪除和定期刪除。
1.1 ?惰性刪除(Lazy Expiration)? ?
- ?原理:當(dāng)客戶端訪問(wèn)一個(gè)鍵時(shí),Redis 會(huì)檢查該鍵是否已過(guò)期。如果已過(guò)期,則立即刪除該鍵,并返回空值。
- ?優(yōu)點(diǎn):只有在訪問(wèn)時(shí)才會(huì)觸發(fā)刪除操作,節(jié)省了 CPU 資源。
- ?缺點(diǎn):如果過(guò)期鍵長(zhǎng)時(shí)間未被訪問(wèn),會(huì)導(dǎo)致內(nèi)存浪費(fèi)。
1.2 ?定期刪除(Active Expiration)? ?
- ?原理:Redis 會(huì)定期(默認(rèn)每秒 10 次)隨機(jī)檢查一定數(shù)量的鍵,刪除其中已過(guò)期的鍵。 ?
- 優(yōu)點(diǎn):可以及時(shí)清理過(guò)期鍵,減少內(nèi)存占用。
- ?缺點(diǎn):如果過(guò)期鍵數(shù)量過(guò)多,可能會(huì)占用一定的 CPU 資源。
1.3 ?過(guò)期策略的平衡
Redis 通過(guò)結(jié)合惰性刪除和定期刪除,實(shí)現(xiàn)了內(nèi)存管理和性能的平衡。惰性刪除確保只有在需要時(shí)才處理過(guò)期鍵,而定期刪除則防止過(guò)期鍵長(zhǎng)期占用內(nèi)存。
二、如何設(shè)置鍵的過(guò)期時(shí)間
Redis 提供了多種命令來(lái)設(shè)置鍵的過(guò)期時(shí)間。
2.1 ?EXPIRE 命令
為鍵設(shè)置一個(gè)以秒為單位的生存時(shí)間。
語(yǔ)法:EXPIRE key seconds
SET mykey "Hello" EXPIRE mykey 60 -- 60 秒后過(guò)期
2.2 ?PEXPIRE 命令
為鍵設(shè)置一個(gè)以毫秒為單位的生存時(shí)間。
語(yǔ)法:PEXPIRE key milliseconds
示例:
SET mykey "Hello" PEXPIRE mykey 60000 -- 60000 毫秒(60 秒)后過(guò)期
2.3 ?EXPIREAT 命令
為鍵設(shè)置一個(gè)以 Unix 時(shí)間戳(秒)為單位的過(guò)期時(shí)間。
語(yǔ)法:EXPIREAT key timestamp
示例:
redis
SET mykey “Hello”
EXPIREAT mykey 1672502400 – 2023-01-01 00:00:00 過(guò)期
2.4 ?PEXPIREAT 命令
為鍵設(shè)置一個(gè)以 Unix 時(shí)間戳(毫秒)為單位的過(guò)期時(shí)間。
語(yǔ)法:PEXPIREAT key timestamp
示例:
SET mykey "Hello" PEXPIREAT mykey 1672502400000 -- 2023-01-01 00:00:00 過(guò)期
2.5 ?TTL 和 PTTL 命令
TTL:返回鍵的剩余生存時(shí)間(秒)。
PTTL:返回鍵的剩余生存時(shí)間(毫秒)。
示例:
TTL mykey -- 返回剩余秒數(shù) PTTL mykey -- 返回剩余毫秒數(shù)
2.6 ?PERSIST 命令
移除鍵的過(guò)期時(shí)間,使其永久有效。
語(yǔ)法:PERSIST key
示例:
PERSIST mykey -- 移除 mykey 的過(guò)期時(shí)間
三、 過(guò)期機(jī)制的實(shí)現(xiàn)原理
Redis 的過(guò)期機(jī)制基于以下數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn):
3.1 ?過(guò)期字典(Expires Dictionary)?
- Redis 使用一個(gè)獨(dú)立的字典(哈希表)來(lái)存儲(chǔ)所有鍵的過(guò)期時(shí)間。
- 鍵是數(shù)據(jù)庫(kù)中的鍵,值是對(duì)應(yīng)的過(guò)期時(shí)間戳。
3.2 ?過(guò)期鍵的刪除
- 惰性刪除:當(dāng)訪問(wèn)鍵時(shí),Redis 會(huì)檢查過(guò)期字典,如果當(dāng)前時(shí)間大于過(guò)期時(shí)間,則刪除該鍵。 ?
- 定期刪除:Redis會(huì)定期隨機(jī)檢查一定數(shù)量的鍵,刪除其中已過(guò)期的鍵。
3.3 ?內(nèi)存回收
當(dāng) Redis 的內(nèi)存使用達(dá)到上限時(shí),會(huì)觸發(fā)內(nèi)存回收機(jī)制(如 maxmemory-policy 配置),優(yōu)先刪除過(guò)期鍵以釋放內(nèi)存。
四、 最佳實(shí)踐
4.1 ?合理設(shè)置過(guò)期時(shí)間
- 根據(jù)業(yè)務(wù)需求設(shè)置合理的過(guò)期時(shí)間,避免鍵過(guò)早或過(guò)晚過(guò)期。
- 對(duì)于緩存場(chǎng)景,可以使用較短的過(guò)期時(shí)間(如幾分鐘或幾小時(shí))。
4.2 ?監(jiān)控過(guò)期鍵數(shù)量
使用 INFO 命令監(jiān)控 Redis 中的過(guò)期鍵數(shù)量,確保內(nèi)存資源得到有效管理。
INFO keyspace
4.3 ?避免大量鍵同時(shí)過(guò)期
如果大量鍵在同一時(shí)間過(guò)期,可能會(huì)導(dǎo)致 Redis 性能下降??梢酝ㄟ^(guò)隨機(jī)化過(guò)期時(shí)間來(lái)緩解這一問(wèn)題。
4.4 ?使用 maxmemory-policy 配置
配置 Redis 的內(nèi)存回收策略,優(yōu)先刪除過(guò)期鍵或最近最少使用的鍵(LRU)。
CONFIG SET maxmemory-policy volatile-lru
五、總結(jié)
Redis 的過(guò)期機(jī)制通過(guò)惰性刪除和定期刪除兩種策略,實(shí)現(xiàn)了內(nèi)存資源的高效管理。通過(guò)合理設(shè)置鍵的過(guò)期時(shí)間,可以優(yōu)化 Redis 的性能和內(nèi)存使用。同時(shí),了解過(guò)期機(jī)制的實(shí)現(xiàn)原理,有助于更好地應(yīng)對(duì)高并發(fā)和大數(shù)據(jù)量的場(chǎng)景。
在實(shí)際應(yīng)用中,建議根據(jù)業(yè)務(wù)需求靈活使用 Redis 的過(guò)期命令,并結(jié)合監(jiān)控工具和配置優(yōu)化,確保 Redis 的穩(wěn)定性和高效性。
參考資料
Redis 官方文檔:https://redis.io/commands#expire
《Redis 設(shè)計(jì)與實(shí)現(xiàn)》——黃健宏
希望這篇博文能幫助你更好地理解 Redis 的過(guò)期策略與鍵的過(guò)期時(shí)間設(shè)置!如果有任何問(wèn)題或建議,歡迎留言討論。
到此這篇關(guān)于Redis 的過(guò)期策略與鍵的過(guò)期時(shí)間設(shè)置的文章就介紹到這了,更多相關(guān)Redis過(guò)期策略內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis實(shí)現(xiàn)優(yōu)惠券限一單限制詳解
這篇文章主要介紹了Redis解決優(yōu)惠券秒殺應(yīng)用案例,本文先講了搶購(gòu)問(wèn)題,指出其中會(huì)出現(xiàn)的多線程問(wèn)題,提出解決方案采用悲觀鎖和樂(lè)觀鎖兩種方式進(jìn)行實(shí)現(xiàn),然后發(fā)現(xiàn)在搶購(gòu)過(guò)程中容易出現(xiàn)一人多單現(xiàn)象,需要的朋友可以參考下2022-12-12Redis存儲(chǔ)斷點(diǎn)續(xù)傳文件狀態(tài)的最佳實(shí)踐
在斷點(diǎn)續(xù)傳系統(tǒng)中,如何高效地存儲(chǔ)和更新文件上傳狀態(tài)是關(guān)鍵,得益于 Redis 高效的內(nèi)存操作和多種數(shù)據(jù)結(jié)構(gòu)的支持,它非常適合用于存儲(chǔ)上傳過(guò)程中的臨時(shí)狀態(tài)信息,下面,我們將探討如何利用 Redis 實(shí)現(xiàn)文件上傳狀態(tài)的存儲(chǔ),需要的朋友可以參考下2024-12-12Redis的數(shù)據(jù)過(guò)期清除策略實(shí)現(xiàn)
Redis實(shí)現(xiàn)了數(shù)據(jù)過(guò)期清除策略,本文將深入解析Redis的數(shù)據(jù)過(guò)期清除策略,包括過(guò)期鍵的刪除方式、清除策略的選擇以及相關(guān)配置參數(shù)的介紹,感興趣的可以了解一下2024-05-05利用redisson快速實(shí)現(xiàn)自定義限流注解(接口防刷)
利用redis的有序集合即Sorted?Set數(shù)據(jù)結(jié)構(gòu),構(gòu)造一個(gè)令牌桶來(lái)實(shí)施限流,而redisson已經(jīng)幫我們封裝成了RRateLimiter,通過(guò)redisson,即可快速實(shí)現(xiàn)我們的目標(biāo),這篇文章主要介紹了利用redisson快速實(shí)現(xiàn)自定義限流注解,需要的朋友可以參考下2024-07-07redis實(shí)現(xiàn)簡(jiǎn)單分布式鎖
這篇文章主要介紹了redis實(shí)現(xiàn)簡(jiǎn)單分布式鎖,文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下2013-09-09淺談一下如何保證Redis緩存與數(shù)據(jù)庫(kù)的一致性
這篇文章主要介紹了一下如何保證Redis緩存與數(shù)據(jù)庫(kù)的一致性,今天這篇文章就帶你詳細(xì)了解一下四種同步策略,需要的朋友可以參考下2023-03-03