<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Redis優(yōu)雅到自己實現(xiàn)了VM

          共 2056字,需瀏覽 5分鐘

           ·

          2021-08-22 22:17

          點擊上方 Java學習之道,選擇 設(shè)為星標

          每天18:30點,干貨準時奉上!

          來源: codenong.com/cs106843764        
          作者: 碼農(nóng)家園

          Redis的VM(虛擬內(nèi)存)機制就是暫時把不經(jīng)常訪問的數(shù)據(jù)(冷數(shù)據(jù))從內(nèi)存交換到磁盤中,從而騰出寶貴的內(nèi)存空間用于其它需要訪問的數(shù)據(jù)(熱數(shù)據(jù))。通過VM功能可以實現(xiàn)冷熱數(shù)據(jù)分離,使熱數(shù)據(jù)仍在內(nèi)存中、冷數(shù)據(jù)保存到磁盤。這樣就可以避免因為內(nèi)存不足而造成訪問速度下降的問題。Redis提高數(shù)據(jù)庫容量的辦法有兩種:一種是可以將數(shù)據(jù)分割到多個Redis Server上;另一種是使用虛擬內(nèi)存把那些不經(jīng)常訪問的數(shù)據(jù)交換到磁盤上。需要特別注意的是Redis并沒有使用OS提供的Swap,而是自己實現(xiàn)。

          Redis為了保證查找的速度,只會將value交換出去,而在內(nèi)存中保留所有的Key。所以它非常適合Key很小,Value很大的存儲結(jié)構(gòu)。如果Key很大,value很小,那么vm可能還是無法滿足需求。

          Part1VM相關(guān)配置

          通過在redis的redis.conf文件里,設(shè)置VM的相關(guān)參數(shù)來實現(xiàn)數(shù)據(jù)在內(nèi)存和磁盤之間 換入和 換出操作。相關(guān)配置如下:

          #開啟vm功能
          vm-enabled yes
          #交換出來的value保存的文件路徑
          vm-swap-file /tmp/redis.swap
          #設(shè)置當內(nèi)存消耗達到上限時開始將value交換出來
          vm-max-memory 1000000
          #設(shè)置單個頁面的大小,單位是字節(jié)
          vm-page-size 32
          #設(shè)置最多能交換保存多少個頁到磁盤
          vm-pages 13417728
          #設(shè)置完成交換動作的工作線程數(shù),設(shè)置為0表示不使用工作線程而使用主線程,這會以阻塞的方式來運行。建議設(shè)置成CPU核個數(shù)
          vm-max-threads 4

          redis規(guī)定同一個數(shù)據(jù)頁面只能保存一個對象,但一個對象可以保存在多個數(shù)據(jù)頁面中。在redis使用的內(nèi)存沒超過vm-max-memory時,是不會交換任何value到磁盤上的。當超過最大內(nèi)存限制后,redis會選擇較老的對象(如果兩個對象一樣老會優(yōu)先交換比較大的對象)將它從內(nèi)存中移除,這樣會更加節(jié)約內(nèi)存。

          對于Redis來說,一個數(shù)據(jù)頁面只會保存一個對象,也就是一個Value值,所以應(yīng)該將vm-page-size設(shè)置成大多數(shù)value可以保存進去。如果設(shè)置太小,一個value對象就會占用幾個數(shù)據(jù)頁面,如果設(shè)置太大,就會造成頁面空閑空間浪費。

          Part2VM的工作機制

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

          1.vm-max-threads = 0

          • 數(shù)據(jù)換出:主線程定期檢查使用的內(nèi)存大小,如果發(fā)現(xiàn)內(nèi)存超出最大上限,會直接以阻塞的方式,將選中的對象 換出 到磁盤上(保存到文件中),并釋放對象占用的內(nèi)存,此過程會一直重復(fù)直到下面條件滿足任意一條才結(jié)束:
            1. 內(nèi)存使用降到最大限制以下。

            2. 設(shè)置的交換文件數(shù)量達到上限。

            3. 幾乎全部的對象都被交換到磁盤了。

          • 數(shù)據(jù)換入:當有client請求key對應(yīng)的value已被換出到磁盤中時,主線程會以阻塞的方式從換出文件中加載對應(yīng)的value對象,加載時此時會阻塞所有client,然后再處理client的請求。這種方式會阻塞所有的client。

          2.vm-max-threads > 0

          • 數(shù)據(jù)換出:當主線程檢測到使用內(nèi)存超過最大上限,會將選中的要交換的數(shù)據(jù)放到一個隊列中交由工作線程后臺處理,主線程會繼續(xù)處理client請求。
          • 數(shù)據(jù)換入:當有client請求key的對應(yīng)的value已被換出到磁盤中時,主線程先阻塞當前client,然后將加載對象的信息放到一個隊列中,讓工作線程去加載,此時進主線程繼續(xù)處理其他client請求。加載完畢后工作線程通知主線程,主線程再執(zhí)行被阻塞的client的命令。這種方式只阻塞單個client。

          Part3總結(jié)

          Redis直接自己構(gòu)建了VM 機制 ,不會像一般的系統(tǒng)會調(diào)用系統(tǒng)函數(shù)處理,會浪費一定的時間去 移動 和 請求,而Redis不存在。這也是Redis能夠那么快的一個原因。

          -- END --

           | 更多精彩文章 -



          加我微信,交個朋友
          長按/掃碼添加↑↑↑

          瀏覽 34
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人操一级片 | 欧美操逼视频 青青操 | 伦理无码| 91精品国产综合久久久不打电影 | 看逼网|