Redis學習手冊 虛擬記憶體

2021-06-06 12:07:31 字數 2238 閱讀 1730

一、簡介:

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

在實際的應用中,大約只有10%的keys屬於相對比較常用的鍵,這樣redis就可以通過虛存將其餘不常用的keys和values換出到磁碟上,而一旦這些被換出的keys或values需要被讀取時,redis則將其再次讀回到主記憶體中。

二、應用場景:

對於大多數資料庫而言,最為理想的執行方式就是將所有的資料都載入到記憶體中,而之後的查詢操作則可以完全基於記憶體資料完成。然而在現實中這樣的場景卻並不普遍,更多的情況則是只有部分資料可以被載入到記憶體中。

在redis中,有乙個非常重要的概念,即keys一般不會被交換,所以如果你的資料庫中有大量的keys,其中每個key僅僅關聯很小的value,那麼這種場景就不是非常適合使用虛擬記憶體。如果恰恰相反,資料庫中只是包含少量的keys,而每乙個key所關聯的value卻非常大,那麼這種場景對於使用虛存就再合適不過了。

在實際的應用中,為了能讓虛存更為充分的發揮作用以幫助我們提高系統的執行效率,我們可以將帶有很多較小值的keys合併為帶有少量較大值的keys。其中最主要的方法就是將原有的key/value模式改為基於hash的模式,這樣可以讓很多原來的keys成為hash中的屬性。

三、配置:

1). 在配置檔案中新增以下配置項,以使當前redis伺服器在啟動時開啟虛存功能。

vm-enabled yes

2). 在配置檔案中設定redis最大可用的虛存位元組數。如果記憶體中的資料大於該值,則有部分物件被換出到磁碟中,其中被換出物件所占用記憶體將被釋放,直到已用記憶體小於該值時才停止換出。

vm-max-memory (bytes)

redis的交換規則是盡量考慮"最老"的資料,即最長時間沒有使用的資料將被換出。如果兩個物件的age相同,那麼value較大的資料將先被換出。需要注意的是,redis不會將keys交換到磁碟,因此如果僅僅keys的資料就已經填滿了整個虛存,那麼這種資料模型將不適合使用虛存機制,或者是將該值設定的更大,以容納整個keys的資料。在實際的應用,如果考慮使用redis虛擬記憶體,我們應盡可能的分配更多的記憶體交給redis使用,以避免頻繁的換入換出。

3). 在配置檔案中設定頁的數量及每一頁所占用的位元組數。為了將記憶體中的資料傳送到磁碟上,我們需要使用交換檔案。這些檔案與資料永續性無關,redis會在退出前會將它們全部刪除。由於對交換檔案的訪問方式大多為隨機訪問,因此建議將交換檔案儲存在固態磁碟上,這樣可以大大提高系統的執行效率。

vm-pages 134217728

vm-page-size 32 

在上面的配置中,redis將交換檔案劃分為vm-pages個頁,其中每個頁所占用的位元組為vm-page-size,那麼redis最終可用的交換檔案大小為:vm-pages * vm-page-size。由於乙個value可以存放在乙個或多個頁上,但是乙個頁不能持有多個value,鑑於此,我們在設定vm-page-size時需要充分考慮redis的該特徵。

4). 在redis的配置檔案中有乙個非常重要的配置引數,即:

vm-max-threads 4

該引數表示redis在對交換檔案執行io操作時所應用的最大執行緒數量。通常而言,我們推薦該值等於主機的cpu cores。如果將該值設定為0,那麼redis在與交換檔案進行io互動時,將以同步的方式執行此操作。

對於redis而言,如果操作交換檔案是以同步的方式進行,那麼當某一客戶端正在訪問交換檔案中的資料時,其它客戶端如果再試圖訪問交換檔案中的資料,該客戶端的請求就將被掛起,直到之前的操作結束為止。特別是在相對較慢或較忙的磁碟上讀取較大的資料值時,這種阻塞所帶來的影響就更為突兀了。然而同步操作也並非一無是處,事實上,從全域性執行效率視角來看,同步方式要好於非同步方式,畢竟同步方式節省了執行緒切換、執行緒間同步,以及執行緒拉起等操作產生的額外開銷。特別是當大部分頻繁使用的資料都可以直接從主記憶體中讀取時,同步方式的表現將更為優異。

如果你的現實應用恰恰相反,即有大量的換入換出操作,同時你的系統又有很多的cores,有鑑於此,你又不希望客戶端在訪問交換檔案之前不得不阻塞一小段時間,如果確實是這樣,我想非同步方式可能更適合於你的系統。

至於最終選用哪種配置方式,最好的答案將來自於不斷的實驗和調優。

分類: 

redis

Redis學習手冊 虛擬記憶體

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

Redis學習手冊 虛擬記憶體

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

Redis學習手冊 虛擬記憶體

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