<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選擇實(shí)現(xiàn)了自己的VM

          共 2044字,需瀏覽 5分鐘

           ·

          2021-07-08 00:44

          點(diǎn)擊上方“程序員大白”,選擇“星標(biāo)”公眾號

          重磅干貨,第一時間送達(dá)

          Redis的VM(虛擬內(nèi)存)機(jī)制就是暫時把不經(jīng)常訪問的數(shù)據(jù)(冷數(shù)據(jù))從內(nèi)存交換到磁盤中,從而騰出寶貴的內(nèi)存空間用于其它需要訪問的數(shù)據(jù)(熱數(shù)據(jù))。通過VM功能可以實(shí)現(xiàn)冷熱數(shù)據(jù)分離,使熱數(shù)據(jù)仍在內(nèi)存中、冷數(shù)據(jù)保存到磁盤。這樣就可以避免因?yàn)閮?nèi)存不足而造成訪問速度下降的問題。

          Redis提高數(shù)據(jù)庫容量的辦法有兩種:一種是可以將數(shù)據(jù)分割到多個Redis Server上;另一種是使用虛擬內(nèi)存把那些不經(jīng)常訪問的數(shù)據(jù)交換到磁盤上。需要特別注意的是Redis并沒有使用OS提供的Swap,而是自己實(shí)現(xiàn)。

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

          VM相關(guān)配置

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

          相關(guān)配置如下:

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

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

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

          VM的工作機(jī)制

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

          第一種:vm-max-threads = 0

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

          1. 內(nèi)存使用降到最大限制以下。
          2. 設(shè)置的交換文件數(shù)量達(dá)到上限。
          3. 幾乎全部的對象都被交換到磁盤了。

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

          第二種:vm-max-threads > 0

          數(shù)據(jù)換出: 當(dāng)主線程檢測到使用內(nèi)存超過最大上限,會將選中的要交換的數(shù)據(jù)放到一個隊(duì)列中交由工作線程后臺處理,主線程會繼續(xù)處理client請求。

          數(shù)據(jù)換入: 當(dāng)有client請求key的對應(yīng)的value已被換出到磁盤中時,主線程先阻塞當(dāng)前client,然后將加載對象的信息放到一個隊(duì)列中,讓工作線程去加載,此時進(jìn)主線程繼續(xù)處理其他client請求。加載完畢后工作線程通知主線程,主線程再執(zhí)行被阻塞的client的命令。這種方式只阻塞單個client。

          總結(jié)

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

          (感謝閱讀,希望對你所有幫助)
          來源:www.codenong.com/cs106843764


          國產(chǎn)小眾瀏覽器因屏蔽視頻廣告,被索賠100萬(后續(xù))

          年輕人“不講武德”:因看黃片上癮,把網(wǎng)站和786名女主播起訴了

          中國聯(lián)通官網(wǎng)被發(fā)現(xiàn)含木馬腳本,可向用戶推廣色情APP

          張一鳴:每個逆襲的年輕人,都具備的底層能力


          關(guān)


          學(xué),西學(xué)學(xué)運(yùn)護(hù),質(zhì),結(jié),關(guān)[],學(xué)習(xí)進(jìn)!


          瀏覽 37
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  国产午夜无码视频在线观看 | 亚洲高清无码专区 | 日本xxxxxwww18 | 操逼逼逼逼网站 | 我要日B日B日B日B日B |