LRU(less recently used)是Redis唯一支持的回收算法赤拒,當(dāng)緩存占用的內(nèi)存空間達(dá)到設(shè)置的最大空間時(shí)敌蜂,會(huì)自動(dòng)驅(qū)逐老的數(shù)據(jù)捌木。
驅(qū)逐策略有以下幾種:
- noeviction: 不刪除策略庸论。達(dá)到內(nèi)存限制時(shí)直接返回錯(cuò)誤铛纬。
- allkey-lru: 所有key通用厌均。優(yōu)先刪除最近最少使用的key。
- volatile-lru: 只限設(shè)置了expire的key告唆。優(yōu)先刪除最近最少使用的key棺弊。
- allkeys-random: 所有key通用。隨機(jī)刪除一部分key擒悬。
- volatile-random: 只限設(shè)置了expire的key模她。隨機(jī)刪除一部分key。
- volatile-ttl: 只限設(shè)置了expire的key懂牧。優(yōu)先刪除剩余時(shí)間(time to live)短的key侈净。
一般來(lái)說(shuō):
- 如果分為冷熱數(shù)據(jù),推薦allkey-lru策略。
- 如果需要循環(huán)讀寫所有的key畜侦,或者各個(gè)key訪問(wèn)頻率差不多元扔,可以選擇allkeys-random策略。
- 如果要讓Redis根據(jù)TTL來(lái)篩選刪除key旋膳,可以使用volatile-ttl策略澎语。
volatile-lru和volatile-random主要應(yīng)用場(chǎng)景是:既有緩存,又有持久key的實(shí)例中验懊,一般這類場(chǎng)景應(yīng)該使用單獨(dú)的Redis實(shí)例咏连。
值得一提的是,設(shè)置expire會(huì)消耗額外的內(nèi)存鲁森,所以使用allkey-lru可以更高效地使用內(nèi)存祟滴,因?yàn)檫@樣使用的時(shí)候不需要設(shè)置過(guò)期時(shí)間。
Redis使用的并不是完全LRU算法歌溉,而是近似LRU算法垄懂。被刪除的key也不一定是最滿足LRU特征的key,而是通過(guò)近似LRU算法抽樣痛垛,然后刪除訪問(wèn)時(shí)間最古老的key草慧。這樣做得原因也是為了節(jié)省內(nèi)存空間,在新版本3.0開(kāi)始匙头,使用pool(池子)來(lái)作為候選漫谷,這大大提高了算法效率,也使得近似LRU算法越來(lái)越接近純LRU算法蹂析。