拒絕躺平,Redis 實現了自己的 VM!

語言: CN / TW / HK

Redis的VM(虛擬記憶體)機制就是暫時把不經常訪問的資料(冷資料)從記憶體交換到磁碟中,從而騰出寶貴的記憶體空間用於其它需要訪問的資料(熱資料)。

通過VM功能可以實現冷熱資料分離,使熱資料仍在記憶體中、冷資料儲存到磁碟。這樣就可以避免因為記憶體不足而造成訪問速度下降的問題。

Redis提高資料庫容量的辦法有兩種:

1、一種是可以將資料分割到多個Redis Server上;

2、另一種是使用虛擬記憶體把那些不經常訪問的資料交換到磁碟上。

需要特別注意的是Redis並沒有使用OS提供的Swap,而是自己實現。

Redis為了保證查詢的速度,只會將value交換出去,而在記憶體中保留所有的Key。所以它非常適合Key很小,Value很大的儲存結構。如果Key很大,value很小,那麼vm可能還是無法滿足需求。

1、VM相關配置

通過在redis的redis.conf檔案裡,設定VM的相關引數來實現資料在記憶體和磁碟之間 換入和 換出操作。 相關配置如下:

#開啟vm功能
vm-enabled yes
#交換出來的value儲存的檔案路徑
vm-swap-file /tmp/redis.swap
#設定當記憶體消耗達到上限時開始將value交換出來
vm-max-memory 1000000
#設定單個頁面的大小,單位是位元組
vm-page-size 32
#設定最多能交換儲存多少個頁到磁碟
vm-pages 13417728
#設定完成交換動作的工作執行緒數,設定為0表示不使用工作執行緒而使用主執行緒,這會以阻塞的方式來執行。建議設定成CPU核個數
vm-max-threads 4

redis規定同一個資料頁面只能儲存一個物件,但一個物件可以儲存在多個數據頁面中。在redis使用的記憶體沒超過vm-max-memory時,是不會交換任何value到磁碟上的。當超過最大記憶體限制後,redis會選擇較老的物件(如果兩個物件一樣老會優先交換比較大的物件)將它從記憶體中移除,這樣會更加節約記憶體。

對於Redis來說,一個數據頁面只會儲存一個物件,也就是一個Value值,所以應該將vm-page-size設定成大多數value可以儲存進去。如果設定太小,一個value物件就會佔用幾個資料頁面,如果設定太大,就會造成頁面空閒空間浪費。

2、VM的工作機制

redis的VM的工作機制分為兩種:一種是vm-max-threads=0,一種是vm-max-threads>0。

第一種:vm-max-threads = 0

資料換出:

主執行緒定期檢查使用的記憶體大小,如果發現記憶體超出最大上限,會直接以阻塞的方式,將選中的物件 換出 到磁碟上(儲存到檔案中),並釋放物件佔用的記憶體,此過程會一直重複直到下面條件滿足任意一條才結束:

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

2.設定的交換檔案數量達到上限。

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

資料換入:

當有client請求key對應的value已被換出到磁碟中時,主執行緒會以阻塞的方式從換出檔案中載入對應的value物件,載入時此時會阻塞所有client,然後再處理client的請求。這種方式會阻塞所有的client。

第二種:vm-max-threads > 0

資料換出:

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

資料換入:

當有client請求key的對應的value已被換出到磁碟中時,主執行緒先阻塞當前client,然後將載入物件的資訊放到一個佇列中,讓工作執行緒去載入,此時進主執行緒繼續處理其他client請求。載入完畢後工作執行緒通知主執行緒,主執行緒再執行被阻塞的client的命令。這種方式只阻塞單個client。

總結:Redis直接自己構建了VM 機制 ,不會像一般的系統會呼叫系統函式處理,會浪費一定的時間去 移動 和 請求,而Redis不存在。這也是Redis能夠那麼快的一個原因。

原文連結:https://blog.csdn.net/Seky_fei/article/details/106843764/

版權宣告:本文為CSDN博主「有鹽先生」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2021最新版)

2.終於靠開源專案弄到 IntelliJ IDEA 啟用碼了,真香!

3.阿里 Mock 工具正式開源,幹掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式釋出,全新顛覆性版本!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!