設置(zhi)Redis的LRU策(ce)略
概念
LRU(Least Recently Used)最(zui)近(jin)最(zui)少使(shi)用(yong)算法(fa)是眾多置換算法(fa)中的一種。
maxmemory
Redis中有(you)一個maxmemory概念,主(zhu)要(yao)是為了將(jiang)使(shi)用的(de)內存(cun)限定(ding)(ding)在一個固定(ding)(ding)的(de)大小。Redis用到(dao)的(de)LRU 算法(fa),是一種(zhong)近似的(de)LRU算法(fa)。
設置maxmemory
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "0"
127.0.0.1:6379> CONFIG SET maxmemory 100MB
OK
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "104857600"
注意,在64bit系(xi)統下,maxmemory設置為0表示不限(xian)制(zhi)Redis內存使(shi)用,在32bit系(xi)統下,maxmemory隱(yin)式不能超過3GB。 當Redis內存使(shi)用達到指定的限(xian)制(zhi)時,就(jiu)需要選擇(ze)一個置換的策略。
置換策略
當Redis內存使用達到maxmemory時,需要選擇設置好的maxmemory-policy進行對老數據的置換。
下(xia)面是可(ke)以選擇(ze)的置換策略:
- noeviction: 不進行置換,表示即使內存達到上限也不進行置換,所有能引起內存增加的命令都會返回error
- allkeys-lru: 優先刪除掉最近最不經常使用的key,用以保存新數據
- volatile-lru: 只從設置失效(expire set)的key中選擇最近最不經常使用的key進行刪除,用以保存新數據
- allkeys-random: 隨機從all-keys中選擇一些key進行刪除,用以保存新數據
- volatile-random: 只從設置失效(expire set)的key中,選擇一些key進行刪除,用以保存新數據
- volatile-ttl: 只從設置失效(expire set)的key中,選出存活時間(TTL)最短的key進行刪除,用以保存新數據
volatile-lru和volatile-random經常(chang)在一個Redis實例既做(zuo)cache又做(zuo)持(chi)久化的(de)情況下用(yong)到,然(ran)而(er),更(geng)好的(de)選擇使(shi)用(yong)兩個Redis實例來解決(jue)這個問題。設(she)置是失(shi)效時間(jian)expire會占用(yong)一些內(nei)存(cun),而(er)采(cai)用(yong)allkeys-lru就沒有必(bi)要設(she)置失(shi)效時間(jian),進(jin)而(er)更(geng)有效的(de)利用(yong)內(nei)存(cun)。
3 置換策略是如何工作的
理解置換(huan)策略的執(zhi)行方式是非(fei)常重要的,比如:
- 客戶端執行一條新命令,導致數據庫需要增加數據(比如set key value)
- Redis會檢查內存使用,如果內存使用超過maxmemory,就會按照置換策略刪除一些key
- 新的命令執行成功
我們持續(xu)的寫數據會(hui)(hui)導致內存(cun)(cun)達到(dao)或超出上(shang)限(xian)(xian)maxmemory,但是置換(huan)策略會(hui)(hui)將(jiang)內存(cun)(cun)使用降低到(dao)上(shang)限(xian)(xian)以下。
如果一(yi)(yi)次需要使用很多的(de)內存(cun)(cun)(比如一(yi)(yi)次寫入一(yi)(yi)個很大的(de)set),那(nei)么(me),Redis的(de)內存(cun)(cun)使用可能超(chao)出(chu)最(zui)大內存(cun)(cun)限制一(yi)(yi)段(duan)時間。
設置轉換策略
127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory"
2) "0"
127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-lru
OK
127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lru"