Redis VM使用

大千世界,茫茫人海,相識就是一種緣分。若此篇文章對您有幫助,點個贊或點個關注唄!

前言

  Redis處理的速度很快,因爲它是基於內存的。在內存能夠足夠容納數據的時候,所有的數據都存放在內存。這個時候不論是讀取數據還是寫入數據都是非常快的。但是如果數據量很大,大到內存已經無法全部容納的時候,我想對存儲有一定了解的人都在想,這個時候redis是怎麼處理的呢?處理速度是否會直線下降?

  幸虧,答案是否定的。Redis使用到了VM,在redis.conf設置vm-enabled yes 即開啓VM功能。 通過VM功能可以實現冷熱數據分離。使熱數據仍在內存中,冷數據保存到磁盤。這樣就可以避免因爲內存不足而造成訪問速度下降的問題。在這裏,需要特別提到的是,Redis並沒有使用OS提供的Swap,而是自己實現。

  • OS是基於page(4K)來做的,它的粒度對於Redis來說太大。而redis的大多數對象都遠小於4k,所以一個OS頁面上可能有多個redis對象。另外redis的集合對象類型如list,set可能存在與多個OS頁面上。最終可能造成只有10%的key被經常訪問,但是所有OS頁面都會被OS認爲是活躍的,這樣只有內存真正耗盡時OS纔會交換頁面;
  • 相比於OS的交換方式。redis可以將被交換到磁盤的對象進行壓縮,保存到磁盤的對象可以去除指針和對象元數據信息。一般壓縮後對象會比內存中對象小10倍。這樣redis的vm會比OS vm能少做很多io操作;
  • OS交換的時候,是會阻塞線程的,而Redis可以設置讓工作線程來完成,主線程仍可以繼續接收client的請求。

  開啓VM功能後,還有其他幾個設置需要設置vm-swap-file:設置被交換出的值保存到磁盤的位置。vm-max-memory:設置當內存消耗達到上限時開始將value交換出來。vm-page-size:設置單個頁面的大小,單位是字節。vm-pages:設置最多能交換保存多少個頁到磁盤。可以算出可以交換出來的最大大小爲vm-page-size * vm-pages。vm-max-threads:設置完成交換動作的工作線程數,設置爲0表示不使用工作線程而使用主線程,這會以阻塞的方式來運行。建議設置成CPU核個數。

  Redis爲了保證查找的速度,只會將value交換出去,而在內存中保留所有的Key。所以它非常適合Key很小,Value很大的存儲結構。如果Key很大,value很小,那麼vm可能還是無法滿足需求。redis規定同一個頁面只能保存一個對象。但是一個對象可以保存在多個頁面中。在redis使用的內存沒超過vm-max-memory之前是不會交換任何value的。當超過最大內存限制後,redis會選擇較老的對象。如果兩個對象一樣老會優先交換比較大的對象,將它從內存中移除,這樣會更加節約內存。

        精確的公式swappability = age*log(size_in_memory)。

  既然對於Redis來說,一個頁面只會保存一個對象,也就是一個Value值,所以應該將vm-page-size設置成大多數value可以保存進去。如果設置太小,一個value對象就會佔用幾個頁面,如果設置太大,就會造成頁面空閒空間浪費。每個頁面,Redis都會在內存中使用1比特(bit)長度來保存頁面的空閒狀態。如果設置的vm-pages非常大,那麼光用來保存頁面狀態就會花費很大的內存。
   VM的工作機制:分爲兩種
  第一種:vm-max-threads = 0
  換出
  主線程定期檢查使用的內存大小,如果發現內存超出最大上限,會直接以阻塞的方式,將選中的對象保存到換出文件中,並釋放對象佔用的內存,此過程會一直重複直到下麪條件滿足:
  1.內存使用降到最大限制以下;
  2. 設置的交換文件數量達到上限;
  3. 幾乎全部的對象都被交換到磁盤了
  換入
  當有客戶端請求的value之前已被換出時,主線程會以阻塞的方式從換出文件中加載對應的value對象,加載時此時會阻塞所有client,然後再處理client的請求。

  第二種:vm-max-threads > 0
  換出
  當主線程檢測到使用內存超過最大上限,會將選中的要交換的對象信息放到一個隊列中交由工作線程後臺處理,主線程會繼續處理client請求。
  換入
  如果有client請求value之前已被換出時,主線程先阻塞當個client,然後將加載對象的信息放到一個隊列中,讓工作線程去加載,此進主線程繼續處理其他client請求。加載完畢後工作線程通知主線程。主線程再執行被阻塞的client的命令。這種方式只阻塞單個client。

【參考文章】 1、https://www.cnblogs.com/xuegang/archive/2011/11/16/2250920.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章