GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者: bruce 文章來源:GreatSQL社區原創 什麼是events_statements_current表 在MySQL中,PFS下有一張記憶體表 ...
緩存過期策略
定時刪除 沒人用
含義:在設置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。