Redis記憶體淘汰
阿新 • • 發佈:2021-07-06
1 記憶體淘汰是指redis使用的記憶體超過了配置檔案裡分配給它的記憶體大小
maxmemory 1GB
2 什麼時候觸發
其實,在redis執行每一個命令的時候,都會檢查當前的記憶體是否超過最大記憶體。如果超過,就會觸發
1)客戶端執行一條新命令,導致資料庫需要增加資料(比如set key value)
2)Redis會檢查記憶體使用,如果記憶體使用超過maxmemory,就會按照置換策略刪除一些key
3)新的命令執行成功
3 每次淘汰的記憶體資料量
如果我們持續的寫資料會導致記憶體達到或超出上限maxmemory,但是置換策略會將記憶體使用降低到上限以下。
如果一次需要使用很多的記憶體(比如一次寫入一個很大的set),那麼,Redis的記憶體使用可能超出最大記憶體限制一段時間。
原始碼中是這樣寫的
/* Compute how much memory we need to free. */ mem_tofree = mem_used - server.maxmemory; mem_freed = 0; //(2)接下來就判斷淘汰策略是基於所有的鍵還是隻是基於設定了過期時間的鍵,如果是針對所有的鍵,就從server.db[j].dict中取資料,如果是針對設定了過期時間的鍵,就從server.db[j].expires中取資料。 while (mem_freed < mem_tofree) {
也就是說,只要降到maxmemory之下,while迴圈就會停止
4 淘汰演算法
volatile-lru:在那些設定了expire過期時間的快取中,清除最少用的舊快取,然後儲存新的快取
* allkeys-lru:清除最少用的舊快取,然後儲存新的快取
* volatile-lfu:在那些設定了expire過期時間的快取中,清除最長時間未用的舊快取,然後儲存新的快取
* allkeys-lfu:清除最長時間未用的舊快取,然後儲存新的快取
* volatile-random:在那些設定了expire過期時間的快取中,隨機刪除快取
* allkeys-random:在所有的快取中隨機刪除(不推薦)
* volatile-ttl:在那些設定了expire過期時間的快取中,刪除即將過期的
* noeviction:舊快取永不過期,新快取設定不了,返回錯誤
方便記憶其實就是分為3種,永不過期特殊情況一種。volatile只針對設定了過期時間一種,allkeys所有的key都算