機器的內存是有限的,當Redis的內存超了允許的最大內存,Redis會按照設定的淘汰策略刪掉超出部分的內容。在進行淘汰時,先判斷是否設置了最大允許內存(server.maxmemory);若是,會調用函數freeMemoryIfNeeded,再判斷使用內存是否超出最大內存限制;若是,就按照設置的淘汰策略淘汰Key,直到使用內存小于最大內存。
可以設置不同的淘汰策略決定刪除的方法。Redis默認有6種淘汰策略,如上圖所示。前三種都是從已經設置過期時間的Key中刪除。Key是臨時數據,若設了過期時間,相比于普通數據,優先級會低一些。這里要注意,lru會影響前面所講的整數對象的共享。
淘汰算法
淘汰算法的步驟分為五步:首先,依次遍歷所有db;然后,按照設置的淘汰策略挑選一個Key進行淘汰;若策略是lru或ttl,采用近似算法,隨機取n個樣本(默認為5,可配置),從中選出最佳值;遍歷完后,計算當前使用內存量是否超過允許值;若是,則繼續步驟1。
因為大部分的操作都是以Key為單位,若一個容器對象很大,對整個Key操作,或直接刪除Key耗時過長,從而導致其他命令長時間內沒法響應到。另外,寫入大Key導致內存超出太多,下次淘汰就需要淘汰很多內存。比如說最大內存是1G,寫1G內存時發現最大內存沒有超,但是若再寫入一個5G的數據,等下一個命令來,發現Redis里面有6G數據,說明有5G的數據要去刪除,那么刪除時,不會一下就取到5G的數值,很有可能會把其他所有的Key都刪除之后,發現還不夠,然后再刪除那5G的數據。還有一個情況,內存100%且無Key可淘汰時,這些命令全都不允許再操作了。
原地址:https://mp.weixin.qq.com/s/n4HXKXPKf87qgZ_e6s4gPg