快取過期策略
定時洗掉 沒人用
含義:在設定key的過期時間的同時,為該key創建一個定時器,讓定時器在key的過期時間來臨時,對key進行洗掉
優點:該策略可以立即清除過期的資料, 保證記憶體被盡快釋放
缺點:若過期key很多,洗掉這些key會占用很多的CPU時間,在CPU時間緊張的情況下,CPU不能把所有的時間用來做要緊的事兒,還需要去花時間洗掉這些key 定時器的創建耗時,若為每一個設定過期時間的key創建一個定時器(將會有大量的定時器產生),性能影響嚴重
惰性洗掉 內置策略
含義:key過期的時候不洗掉,只有當訪問這個key的時候才去判斷快取是不是過期,若過期,則洗掉,回傳null,
優點:洗掉操作只發生在從資料庫取出key的時候發生,而且只洗掉當前key,所以對CPU時間的占用是比較少的,而且此時的洗掉是已經到了非做不可的地步(如果此時還不洗掉的話,我們就會獲取到了已經過期的key了)
缺點:對記憶體非常不友好,若大量的key在超出超時時間后沒有被訪問,長時間過去可能發生記憶體泄露(無用的垃圾占用了大量的記憶體)
定期洗掉
含義:每隔一定的時間,會掃描一定數量的的key,并清除其中已經過期的key (在redis.conf組態檔設定hz,1s重繪的頻率)
該策略是前兩者的一個折中方案,通過調整定時掃描的時間間隔和每次掃描的限定耗時,可以在不同情況下使得CPU和記憶體資源達到最優的平衡效果
缺點: 在記憶體友好方面,不如"定時洗掉";在CPU時間友好方面,不如"惰性洗掉" 難點:合理設定洗掉操作的執行時長(每次洗掉執行多長時間)和執行頻率(每隔多長時間做一次洗掉)(這個要根據服務器運行情況來定了)
看完上方三種可以得到結論: 定時洗掉和定期洗掉為主動洗掉,Redis會定期主動淘汰一批已過去的key;惰性洗掉為被動洗掉:用到的時候才會去檢驗key是不是已過期,過期就洗掉
惰性洗掉為redis服務器內置策略
定期洗掉可以通過:
第一、配置redis.conf 的hz選項,默認為10 (即1秒執行10次,100ms一次,值越大說明重繪頻率越快,最Redis性能損耗也越大)
第二、配置redis.conf的maxmemory最大值,當已用記憶體超過maxmemory限定時,就會觸發主動清理策略
記憶體淘汰策略
Redis的記憶體淘汰策略
-
noeviction:當記憶體不足以容納新寫入資料時,新寫入操作會報錯,該策略是Redis的默認淘汰策略,一般不會選用,
-
allkeys-lru:當記憶體不足以容納新寫入資料時,基于LRU演算法,從所有key中,移除最近最少使用的key,
-
allkeys-random:當記憶體不足以容納寫入資料時,從所有key中,隨機移除某個key,這個一般沒人用,
-
allkeys-lfu:當記憶體不足以容納寫入資料時,基于LFU演算法,從所有key中,洗掉掉最不經常使用(使用次數最少)的key,
-
volatile-lru:當記憶體不足以容納寫入資料時,基于LRU演算法,在設定了過期時間的key中,移除最近最少使用的key,
-
volatile-random:當記憶體不足以容納寫入資料時,在設定了過期時間的key中,隨機移除某個key,
-
volatile-ttl:當記憶體不足以容納寫入資料時,在設定了過期時間的key中,(剩余存活時間最短)的key洗掉掉,
-
volatile-lfu:當記憶體不足以容納寫入資料時,基于LFU演算法,從設定了過期時間的key中,洗掉掉最不經常使用(使用次數最少)的key,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/545255.html
標籤:NoSQL
