天天看點

京東二面:Redis如何避免記憶體耗盡

redis的資料都是存放在記憶體中,而對于伺服器來說記憶體是很有限的,那我們應該如何避免記憶體耗盡呢?

一、記憶體回收

在設定redis鍵值時務必設定過期時間,除開一些需要持久化儲存key的場景;

expire key time(以秒為機關)//這是最常用的方式

setex(String key, int seconds, String value)//字元串獨有的方式      

除了字元串自己獨有設定過期時間的方法外,其他方法都需要依靠expire方法來設定時間

二、3種過期政策

定時删除:為每個鍵設定一個定時器,一旦過期時間到了,則将鍵删除。這種政策對記憶體很友好,但是對 CPU 不友好,因為每個定時器都會占用一定的CPU 資源。

惰性删除:不管鍵有沒有過期都不主動删除,等到每次去擷取鍵時再判斷是否過期,如果過期就删除該鍵,否則傳回鍵對應的值。這種政策對記憶體不夠友好,可能會浪費很多記憶體。

定期掃描:系統每隔一段時間就定期掃描一次,發現過期的鍵就進行删除。這種政策相對來說是上面兩種政策的折中方案,需要注意的是這個定期的頻率要結合實際情況掌控好,使用這種方案有一個缺陷就是可能會出現已經過期的鍵也被傳回。

Redis選擇的是惰性删除和定期掃描的綜合使用。不過 Redis 的定期掃描隻會掃描設定了過期時間的鍵,因為設定了過期時間的鍵 Redis 會單獨存儲,是以不會出現掃描所有鍵的情況;

三、8種淘汰政策

如果伺服器記憶體滿了,但是依然繼續執行redis的set操作,就會觸發淘汰政策,可以通過參數 maxmemory-policy 進行配置;

京東二面:Redis如何避免記憶體耗盡

順便說說redis記憶體設定

一般設定為實體記憶體最大值的3/4;

在redisconf檔案裡面有個maxmemory,注意機關是位元組!!!

京東二面:Redis如何避免記憶體耗盡

繼續閱讀