官方網(wǎng)站做自適應(yīng)好還是響應(yīng)式廈門人才網(wǎng)個(gè)人會(huì)員
上一篇地址:持續(xù)總結(jié)中!2024年面試必問 20 道 Redis面試題(三)-CSDN博客
七、Redis過期鍵的刪除策略?
Redis 過期鍵的刪除策略主要涉及以下幾種方式:
1.?定時(shí)刪除(Timed Expiration)
這是最直接的過期鍵刪除策略。當(dāng)為一個(gè)鍵設(shè)置過期時(shí)間后,Redis 會(huì)在該鍵達(dá)到過期時(shí)間時(shí)立即將其刪除。這種方式的優(yōu)點(diǎn)是確保了數(shù)據(jù)的實(shí)時(shí)性,過期數(shù)據(jù)能夠立即被清理出去,但缺點(diǎn)是可能會(huì)對(duì)性能產(chǎn)生影響,因?yàn)槊總€(gè)帶有過期時(shí)間的鍵都需要?jiǎng)?chuàng)建一個(gè)定時(shí)器來監(jiān)控。
2.?惰性刪除(Lazy Expiration)
在這種策略下,鍵并不會(huì)在過期時(shí)立即被刪除,而是在下一次訪問該鍵時(shí)才會(huì)被檢查并刪除。這種方式的優(yōu)點(diǎn)是可以節(jié)省CPU資源,因?yàn)樗苊饬硕〞r(shí)器的開銷。但是,它可能會(huì)導(dǎo)致過期數(shù)據(jù)在內(nèi)存中駐留較長(zhǎng)時(shí)間,從而占用內(nèi)存空間。
3.?定期掃描刪除(Periodic Expiration)
Redis 會(huì)定期掃描鍵空間以查找并刪除過期的鍵。這種策略通過隨機(jī)抽樣的方式來減少對(duì)性能的影響,但無法保證過期數(shù)據(jù)能夠及時(shí)被刪除。定期掃描可以配置不同的頻率和條件,以適應(yīng)不同的性能和實(shí)時(shí)性需求。
4.?內(nèi)存淘汰策略(Eviction Policies)
當(dāng)內(nèi)存不足時(shí),Redis 會(huì)根據(jù)配置的內(nèi)存淘汰策略來決定哪些鍵應(yīng)該被刪除。這些策略包括但不限于:
- noeviction:不刪除任何數(shù)據(jù),如果內(nèi)存不足,寫入操作將被拒絕。
- allkeys-lru:從所有鍵中刪除最近最少使用的鍵。
- allkeys-random:從所有鍵中隨機(jī)刪除鍵。
- volatile-lru:從設(shè)置了過期時(shí)間的鍵中刪除最近最少使用的鍵。
- volatile-random:從設(shè)置了過期時(shí)間的鍵中隨機(jī)刪除鍵。
- volatile-ttl:刪除即將過期的鍵。
5.?內(nèi)存碎片整理(Active Defragmentation)
在 Redis 4.0 及以上版本中,可以啟用內(nèi)存碎片整理功能。這個(gè)功能可以在后臺(tái)異步地整理內(nèi)存,減少內(nèi)存碎片,從而提高內(nèi)存的使用效率。雖然這個(gè)功能不直接刪除過期鍵,但它有助于提高內(nèi)存的總體性能。
6.?使用 Redis 4.0 及以上版本的優(yōu)化特性
Redis 4.0 引入了一些新特性,比如 LAZY FREE
,可以在后臺(tái)線程中異步地釋放過期鍵占用的內(nèi)存,減少對(duì)主線程的影響。
7.?過期時(shí)間分散策略
為了避免大量鍵在同一時(shí)間過期導(dǎo)致的性能問題,可以通過在設(shè)置的過期時(shí)間上增加一個(gè)隨機(jī)偏移量,使得過期時(shí)間分散在一段時(shí)間內(nèi),從而避免刪除操作的集中。
通過這些策略的組合使用,Redis 能夠在保證性能的同時(shí),有效地管理過期鍵的刪除,確保緩存數(shù)據(jù)的時(shí)效性和內(nèi)存使用的效率。
八、Redis的回收策略(淘汰策略)?
Redis 提供了多種數(shù)據(jù)淘汰策略,用于在內(nèi)存不足時(shí)從鍵空間中選擇并移除數(shù)據(jù)。以下是 Redis 支持的主要淘汰策略:
1.?noeviction
此策略會(huì)阻止任何新寫入操作,如果內(nèi)存限制達(dá)到,嘗試寫入數(shù)據(jù)時(shí)會(huì)返回錯(cuò)誤。這種策略不會(huì)淘汰任何現(xiàn)有的鍵。
2.?allkeys-lru
這種策略會(huì)淘汰整個(gè)鍵空間中最久未被訪問的鍵(Least Recently Used)。它適用于那些訪問模式下舊數(shù)據(jù)很少被再次訪問的場(chǎng)景。
3.?allkeys-random
此策略會(huì)從所有鍵中隨機(jī)選擇并淘汰一個(gè)鍵。它是一種簡(jiǎn)單且公平的淘汰方式,但可能不是最優(yōu)化的。
4.?volatile-lru
這種策略會(huì)淘汰那些設(shè)置了過期時(shí)間的鍵中最久未被訪問的鍵。如果鍵空間中沒有可淘汰的過期鍵,Redis 將嘗試使用 noeviction
策略。
5.?volatile-random
此策略會(huì)從設(shè)置了過期時(shí)間的鍵中隨機(jī)淘汰一個(gè)鍵。與 volatile-lru
類似,如果沒有過期鍵,Redis 將使用 noeviction
策略。
6.?volatile-ttl
這種策略會(huì)淘汰那些設(shè)置了過期時(shí)間的鍵中,剩余生存時(shí)間(Time To Live, TTL)最短的鍵。如果沒有過期鍵,Redis 同樣會(huì)使用 noeviction
策略。
7.?allkeys-lfu
這種策略會(huì)淘汰整個(gè)鍵空間中最少使用的鍵(Least Frequently Used)。適用于那些訪問模式下某些數(shù)據(jù)很少被訪問的場(chǎng)景。
8.?volatile-lfu
此策略會(huì)淘汰設(shè)置了過期時(shí)間的鍵中最少使用的鍵。如果沒有過期鍵,Redis 將使用 noeviction
策略。
配置淘汰策略
淘汰策略可以在 Redis 配置文件中設(shè)置,通過 maxmemory-policy
配置項(xiàng)進(jìn)行配置。例如:
maxmemory-policy allkeys-lru
這行配置表示當(dāng) Redis 達(dá)到內(nèi)存上限時(shí),將使用 LRU 策略淘汰數(shù)據(jù)。
考慮因素
在選擇淘汰策略時(shí),需要考慮以下因素:
- 數(shù)據(jù)訪問模式:不同的應(yīng)用有不同的數(shù)據(jù)訪問模式,選擇一個(gè)與訪問模式相匹配的淘汰策略非常重要。
- 數(shù)據(jù)時(shí)效性:對(duì)于那些過期后不再需要的數(shù)據(jù),使用考慮 TTL 的淘汰策略可能更合適。
- 內(nèi)存限制:了解系統(tǒng)的內(nèi)存限制,并根據(jù)可用內(nèi)存選擇合適的淘汰策略。
- 業(yè)務(wù)需求:不同的業(yè)務(wù)對(duì)數(shù)據(jù)的準(zhǔn)確性和實(shí)時(shí)性有不同的需求,需要根據(jù)業(yè)務(wù)需求選擇淘汰策略。
總結(jié)
Redis 的淘汰策略提供了靈活的選擇,以適應(yīng)不同的應(yīng)用場(chǎng)景和業(yè)務(wù)需求。正確配置和使用這些策略,可以幫助確保 Redis 在內(nèi)存限制下依然能夠高效穩(wěn)定地運(yùn)行。