- Redis佔用內存大小
- Redis的內存淘汰
- LRU算法
- LRU在Redis中的實現
- LFU算法
- 問題
Redis佔用內存大小
咱們知道Redis是基於內存的key-value數據庫,由於系統的內存大小有限,因此咱們在使用Redis的時候能夠配置Redis能使用的最大的內存大小。php
一、經過配置文件配置
經過在Redis安裝目錄下面的redis.conf配置文件中添加如下配置設置內存大小面試
//設置Redis最大佔用內存大小爲100M maxmemory 100mb
redis的配置文件不必定使用的是安裝目錄下面的redis.conf文件,啓動redis服務的時候是能夠傳一個參數指定redis的配置文件的
二、經過命令修改
Redis支持運行時經過命令動態修改內存大小redis
//設置Redis最大佔用內存大小爲100M 127.0.0.1:6379> config set maxmemory 100mb //獲取設置的Redis能使用的最大內存大小 127.0.0.1:6379> config get maxmemory
若是不設置最大內存大小或者設置最大內存大小爲0,在64位操做系統下不限制內存大小,在32位操做系統下最多使用3GB內存
Redis的內存淘汰
既然能夠設置Redis最大佔用內存大小,那麼配置的內存就有用完的時候。那在內存用完的時候,還繼續往Redis裏面添加數據不就沒內存可用了嗎?實際上Redis定義了幾種策略用來處理這種狀況:noeviction(默認策略):對於寫請求再也不提供服務,直接返回錯誤(DEL請求和部分特殊請求除外)allkeys-lru:從全部key中使用LRU算法進行淘汰volatile-lru:從設置了過時時間的key中使用LRU算法進行淘汰allkeys-random:從全部key中隨機淘汰數據volatile-random:從設置了過時時間的key中隨機淘汰volatile-ttl:在設置了過時時間的key中,根據key的過時時間進行淘汰,越早過時的越優先被淘汰算法
當使用 volatile-lru、 volatile-random、 volatile-ttl這三種策略時,若是沒有key能夠被淘汰,則和 noeviction同樣返回錯誤
如何獲取及設置內存淘汰策略
獲取當前內存淘汰策略:數據庫
127.0.0.1:6379> config get maxmemory-policy
經過配置文件設置淘汰策略(修改redis.conf文件):緩存
maxmemory-policy allkeys-lru
經過命令修改淘汰策略:架構
127.0.0.1:6379> config set maxmemory-policy allkeys-lru
LRU算法
什麼是LRU?
上面說到了Redis可以使用最大內存使用完了,是可使用LRU算法進行內存淘汰的,那麼什麼是LRU算法呢?併發
LRU(Least Recently Used),即最近最少使用,是一種緩存置換算法。在使用內存做爲緩存的時候,緩存的大小通常是固定的。當緩存被佔滿,這個時候繼續往緩存裏面添加數據,就須要淘汰一部分老的數據,釋放內存空間用來存儲新的數據。這個時候就可使用LRU算法了。其核心思想是:若是一個數據在最近一段時間沒有被用到,那麼未來被使用到的可能性也很小,因此就能夠被淘汰掉。
LRU在Redis中的實現
近似LRU算法
Redis使用的是近似LRU算法,它跟常規的LRU算法還不太同樣。近似LRU算法經過隨機採樣法淘汰數據,每次隨機出5(默認)個key,從裏面淘汰掉最近最少使用的key。框架
能夠經過maxmemory-samples參數修改採樣數量:例:maxmemory-samples 10 maxmenory-samples配置的越大,淘汰的結果越接近於嚴格的LRU算法
Redis爲了實現近似LRU算法,給每一個key增長了一個額外增長了一個24bit的字段,用來存儲該key最後一次被訪問的時間。dom
以上內容但願幫助到你們,更多PHP大廠PDF面試文檔,PHP進階架構視頻資料,PHP精彩好文免費獲取能夠關注公衆號:PHP開源社區,或者訪問: