Redis是一個(gè)以內(nèi)存為基礎(chǔ)的NoSQL數(shù)據(jù)庫,其數(shù)據(jù)存儲(chǔ)在內(nèi)存中,因此可連續(xù)讀寫速度極快。但是,內(nèi)存存儲(chǔ)也帶來了內(nèi)存限制的問題。因此,當(dāng)Redis內(nèi)存中的數(shù)據(jù)量超過可用內(nèi)存時(shí),會(huì)采用內(nèi)存淘汰策略將某些不必要的數(shù)據(jù)清除出內(nèi)存,以騰出更多空間存儲(chǔ)更有用的數(shù)據(jù)。內(nèi)存淘汰策略就是Redis在內(nèi)存不足時(shí)如何選擇對(duì)象清除。
Redis內(nèi)存淘汰策略類型
Redis提供了6種內(nèi)存淘汰策略,分別是noeviction、allkeys-lru、volatile-lru、allkeys-random、volatile-random、volatile-ttl。noeviction是默認(rèn)策略,表示不進(jìn)行內(nèi)存淘汰。allkeys-lru和volatile-lru表示使用LRU算法選擇對(duì)應(yīng)鍵值對(duì)進(jìn)行淘汰,其中allkeys-lru會(huì)考慮所有鍵值對(duì),而volatile-lru會(huì)僅考慮帶有過期時(shí)間的鍵值對(duì)。allkeys-random和volatile-random表示使用隨機(jī)算法進(jìn)行內(nèi)存淘汰,其中allkeys-random會(huì)考慮所有鍵值對(duì),而volatile-random僅考慮帶有過期時(shí)間的鍵值對(duì)。最后,volatile-ttl表示使用TTL(Time To Live)的時(shí)間長(zhǎng)度作為權(quán)重進(jìn)行淘汰。
Redis內(nèi)存淘汰策略實(shí)戰(zhàn)
一般來說,在Redis中使用LRU淘汰策略時(shí),allkeys-lru一般用于基礎(chǔ)業(yè)務(wù),因?yàn)樗芯彺娑紩?huì)進(jìn)行LRU淘汰,而volatile-lru則在緩存增長(zhǎng)高峰期和與數(shù)據(jù)庫連接的緩存中使用,因?yàn)樗鼉H考慮帶有過期時(shí)間的鍵值對(duì),具有更高的清晰效率。另外,若業(yè)務(wù)具有時(shí)效性,則可以選擇volatile-ttl策略,通過時(shí)間長(zhǎng)度計(jì)算權(quán)重,淘汰內(nèi)存中的鍵值對(duì)。
需要注意的是,使用隨機(jī)算法進(jìn)行淘汰時(shí),可能會(huì)淘汰掉更有用的對(duì)象。若無法承受數(shù)據(jù)丟失,則不要選擇使用隨機(jī)算法進(jìn)行淘汰。同時(shí),普通的Redis實(shí)例應(yīng)用,一般可以使用allkeys-lru策略。
總體來說,Redis的內(nèi)存淘汰策略需要根據(jù)業(yè)務(wù)使用情況進(jìn)行選擇。在實(shí)際應(yīng)用中,需要根據(jù)具體業(yè)務(wù)進(jìn)行選擇才能達(dá)到最佳效果。