拒絕躺平,Redis 實現了自己的 VM!
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能夠那麼快的一個原因。
原文連結:http://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 正式釋出,全新顛覆性版本!
覺得不錯,別忘了隨手點贊+轉發哦!
- Java 中的屠龍之術:如何修改語法樹?
- 採集 Nginx 日誌的幾種方式,你知道幾種?
- Group By 深度優化,真是絕了!
- 面試官:Redis 單執行緒已經很快,為何 6.0要引入多執行緒?有啥優勢?
- 國產 Linux 發行版再添一員,介面不輸蘋果!太漂亮了。。
- Spring Boot Actuator 健康檢查、度量、指標收集、監控,一文搞定!
- for 迴圈的 5 種寫法,哪種最快?
- MySQL 是如何實現 ACID 的?
- 一招搞定 Spring Boot 視覺化監控!
- MyBatis vs Hibernate,到底哪個效能更好?
- Java 程式設計師必須掌握的 10 款開源工具!
- 如何搭建一臺永久執行的個人伺服器?試試這個黑科技!
- 面試官:生成訂單 30 分鐘未支付,則自動取消,該怎麼實現?
- 一招搞定 Spring Boot 視覺化監控!
- 你還在 Docker 中跑 MySQL?恭喜你,可以下崗了!
- Java 如何模擬真正的併發請求?
- 用好這個 IDEA 外掛,寫程式碼效率至少提升 5 倍!
- YAML 有漏洞被棄用?網友:YAML 不背鍋!
- 億級流量架構怎麼做資源隔離?寫得太好了!
- 還在用 Log4j ?快用 Log4j2,效能太猛了!