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

          共 2057字,需瀏覽 5分鐘

           ·

          2021-07-08 19:33

          Redis 源碼中有很多優(yōu)秀的實踐,值得我們學習。它作為開源作品之一,匯聚了眾多開源智慧,深受廣大程序員喜愛。它的優(yōu)秀還導致了不少人都喜歡研究它,面試官也喜歡提問面試者,也使整個行業(yè)進入了更深的內(nèi)卷。

          我相信多數(shù)人還是拒絕選擇躺平的,今天我們一起來了解一下,Redis 的 VM 機制。

          Redis 之 VM 機制

          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可能還是無法滿足需求。

          VM 相關(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 值,所以應該將 vm-page-size 設(shè)置成大多數(shù) value 可以保存進去。如果設(shè)置太小,一個 value 對象就會占用幾個數(shù)據(jù)頁面,如果設(shè)置太大,就會造成頁面空閑空間浪費。

          VM 的工作機制

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

          「第一種:vm-max-threads = 0」

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

            1. 內(nèi)存使用降到最大限制以下。
            2. 設(shè)置的交換文件數(shù)量達到上限。
            3. 幾乎全部的對象都被交換到磁盤了。
          • 數(shù)據(jù)換入:當有 client 請求 key 對應的 value 已被換出到磁盤中時,主線程會以阻塞的方式從換出文件中加載對應的 value 對象,加載時此時會阻塞所有 client,然后再處理 client 的請求。「這種方式會阻塞所有的 client。」

          「第二種:vm-max-threads > 0」

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

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

          總結(jié)

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

          From: codenong.com/cs106843764

          瀏覽 23
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  五月停视频天堂网 | 好吊操这里只有精品 | 奇米久久久久 | 色欲AV自拍影视在线观看 | 午夜草视频 |