Redis考慮虛擬記憶體設計

2021-08-31 07:59:42 字數 2034 閱讀 4366

虛擬記憶體指當物理記憶體不夠用時,借用硬碟的空間來當作物理記憶體使用,就是暫時把不經常訪問的資料從記憶體交換到磁碟中,從而騰出寶貴的 記憶體空間用於其他需要訪問的資料。尤其是對於redis這樣的記憶體資料庫,記憶體總是不夠用的。除了可以將資料分割到多個redis server外。另外的能夠提高資料庫容量的辦法就是使用vm把那些不經常訪問的資料交換的磁碟上。

如果我們的儲存的資料總是有少部分資料被經常訪問,大部分資料很少被訪問,就拿我們做的大資料量統計報表而言,有些歷史資料是不需要經常訪問的,就算訪問也就是那麼幾個固定的使用者,當少量資料被經常訪問時,使用vm不但能提高單台redis server資料庫的容量,而且也不會對效能造成太多影響。

redis沒有使用os提供的虛擬記憶體機制而是自己實現了自己的虛擬記憶體機制,主要的理由有兩點:

1、 redis的集合物件型別如list,set可能存在與多個os頁面上。最終可能造成只有10%key被經常訪問,但是所有os頁面都會被os認為是活躍的,這樣只有記憶體真正耗盡時os才會交換頁面。

2、 相比於os的交換方式。redis可以將被交換到磁碟的物件進行壓縮,儲存到磁碟的物件可以去除指標和物件元資料資訊。一般壓縮後的物件會比記憶體中的物件小10倍。這樣redis的vm會比os vm能少做很多io操作。

redis的vm在設計上為了保證key的查詢速度,只會將value交換到swap檔案中。所以如果是記憶體問題是由於太多value很小的key造成的,那麼vm並不能解決。在redis使用的記憶體沒超過vm-max-memory之前是不會交換任何value的。當超過最大記憶體限制後,redis會選擇較老的物件。如果兩個物件一樣老會優先交換比較大的物件。

何時使用

redis官方文件對vm的使用提出了一些建議: 當你的key很小而value很大時,使用vm的效果會比較好.因為這樣節約的記憶體比較大. 當你的key不小時,可以考慮使用一些非常方法將很大的key變成很大的value,比如你可以考慮將key,value組合成乙個新的value. vm-max-threads這個引數,可以設定訪問swap檔案的執行緒數,設定最好不要超過機器的核數.如果設定為0,那麼所有對swap檔案的操作都是序列的.可能會造成比較長時間的延遲,但是對資料完整性有很好的保證.

如何使用

vm-enabled yes                          #開啟vm功能

vm-swap-file /tmp/redis.swap         #交換出來的value儲存的檔案路徑/tmp/redis.swap

vm-max-memory   redis使用最大記憶體上限,超過上限後redis開始交換value到磁碟檔案中。

vm-page-size            每個頁面的大小(位元組)

vm-pages    #最多使用在檔案中使用多少頁面,交換檔案的大小 = vm-page-size * vm-pages

vm-max-threads          #用於執行value物件換入換出的工作執行緒數量。0表示不使用工作執行緒

官方對vm-max-threads設定說明

當vm-max-threads設為0時(blocking vm)

主線程定期檢查發現記憶體超出最大上限後,會直接已阻塞的方式,將選中的物件儲存到swap檔案中,並釋放物件占用的記憶體,此過程會一直重複直到下面條件滿足

1.記憶體使用降到最大限制以下

2.swap檔案滿了

3.幾乎全部的物件都被交換到磁碟了

當有client請求value被換出的key時。主線程會以阻塞的方式從檔案中載入對應的value物件,載入時此時會阻塞所以client,然後處理client的請求

當vm-max-threads大於0(threaded vm)

當主線程檢測到使用記憶體超過最大上限,會將選中的要交換的物件資訊放到乙個佇列中交由工作執行緒後台處理,主線程會繼續處理client請求。

如果有client請求的key被換出了,主線程先阻塞發出命令的client,然後將載入物件的資訊放到乙個佇列中,讓工作執行緒去載入。載入完畢後工作執行緒通知主線程。主線程再執行client的命令。這種方式只阻塞請求value被換出key的client

Redis學習手冊 虛擬記憶體

一 簡介 和大多nosql資料庫一樣,redis同樣遵循了key value資料儲存模型。在有些情況下,redis會將keys values儲存在記憶體中以提高資料查詢和資料修改的效率,然而這樣的做法並非總是很好的選擇。鑑於此,我們可以將之進一步優化,即盡量在記憶體中只保留keys的資料,這樣可以保...

Redis學習手冊 虛擬記憶體

posted on 2012 04 04 06 34 stephen liu 閱讀 1 編輯收藏 一 簡介 和大多nosql資料庫一樣,redis同樣遵循了key value資料儲存模型。在有些情況下,redis會將keys values儲存在記憶體中以提高資料查詢和資料修改的效率,然而這樣的做法並...

redis虛擬記憶體的使用

redis的虛擬記憶體與作業系統的虛擬記憶體不是一回事,但是思路和目的都是相同的。就是暫時把不經常訪問的資料從記憶體交換到磁碟中,從而騰出寶貴的記憶體空間用於其他需要訪問的資料。尤其是對於redis這樣的記憶體資料庫,記憶體總是不夠用的。除了可以將資料分割王到多個redis server外。另外能夠...