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開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/289144.html
標籤:Java
上一篇:c++ vector用法詳解
