Redis內(nèi)存淘汰指的是用戶存儲(chǔ)的一些鍵被可以被Redis主動(dòng)地從實(shí)例中刪除棺牧,從而產(chǎn)生讀miss的情況。Redis最常見的兩種應(yīng)用場(chǎng)景為緩存和持久存儲(chǔ),首先要明確的一個(gè)問題是內(nèi)存淘汰策略更適合于那種場(chǎng)景?是持久存儲(chǔ)還是緩存添忘?
內(nèi)存的淘汰機(jī)制的初衷是為了更好地使用內(nèi)存,用一定的緩存miss來換取內(nèi)存的使用效率若锁。
首先要配置maxmemory值
1.客戶端發(fā)起了需要申請(qǐng)更多內(nèi)存的命令(如set)搁骑。
2.Redis檢查內(nèi)存使用情況,如果已使用的內(nèi)存大于maxmemory則開始根據(jù)用戶配置的不同淘汰策略來淘汰內(nèi)存(key)又固,從而換取一定的內(nèi)存靶病。
3.如果上面都沒問題,則這個(gè)命令執(zhí)行成功口予。
maxmemory為0的時(shí)候表示我們對(duì)Redis的內(nèi)存使用沒有限制。
Redis提供了下面幾種淘汰策略
volatile-lru:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰
volatile-ttl:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰
volatile-random:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰
allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰
allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰
noeviction:禁止驅(qū)逐數(shù)據(jù)涕侈,當(dāng)內(nèi)存使用達(dá)到閾值的時(shí)候沪停,所有引起申請(qǐng)內(nèi)存的命令會(huì)報(bào)錯(cuò)
設(shè)置方式 ??
config set maxmemory-policy volatile-lru
試驗(yàn)總結(jié):
1,版本不同裳涛,默認(rèn)的策略不同
在2.8.13的版本里木张,默認(rèn)是noeviction,在3.2.3版本里默認(rèn)是volatile-lru
2端三,volatile-lru舷礼、volatile-ttl、volatile-random這幾種只對(duì)設(shè)置了過期時(shí)間的key有效郊闯,不會(huì)淘汰沒有設(shè)置過期時(shí)間的key
3妻献,與是否設(shè)置持久化無關(guān)
4,測(cè)試volatile-lru測(cè)量团赁,在插入有過期時(shí)間的key時(shí)育拨,如果達(dá)到了maxmemory值,就會(huì)對(duì)老的key進(jìn)行淘汰欢摄,插入新值
5熬丧,如果設(shè)置為noeviction或者key沒有過期時(shí)間,當(dāng)達(dá)到最大內(nèi)存值時(shí)就會(huì)直接報(bào)錯(cuò)
下面看看幾種策略的適用場(chǎng)景:
·???????? allkeys-lru:如果我們的應(yīng)用對(duì)緩存的訪問符合冪律分布(也就是存在相對(duì)熱點(diǎn)數(shù)據(jù))怀挠,或者我們不太清楚我們應(yīng)用的緩存訪問分布狀況析蝴,我們可以選擇allkeys-lru策略害捕。
·???????? allkeys-random:如果我們的應(yīng)用對(duì)于緩存key的訪問概率相等,則可以使用這個(gè)策略闷畸。
·???????? volatile-ttl:這種策略使得我們可以向Redis提示哪些key更適合被eviction尝盼。