<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                `hash表`有兩種存儲的數據編碼:ziplist 壓縮列表,ht(hashtable) 哈希表 一, ziplist 壓縮列表 ![](https://img.kancloud.cn/7d/9e/7d9e808a2b9e1c351499e196e23bf02a_886x430.png) ![](https://img.kancloud.cn/67/d2/67d25c899fd037750218048d4b4f6156_857x143.png) ①、previous\_entry\_ength:記錄壓縮列表前一個字節的長度。previous\_entry\_ength的長度可能是1個字節或者是5個字節,如果上一個節點的長度小于254,則該節點只需要一個字節就可以表示前一個節點的長度了,如果前一個節點的長度大于等于254,則previous length的第一個字節為254,后面用四個字節表示當前節點前一個節點的長度。利用此原理即當前節點位置減去上一個節點的長度即得到上一個節點的起始位置,壓縮列表可以從尾部向頭部遍歷。這么做很有效地減少了內存的浪費。 ②、encoding:節點的encoding保存的是節點的content的內容類型以及長度,encoding類型一共有兩種,一種字節數組一種是整數,encoding區域長度為1字節、2字節或者5字節長。 ③、content:content區域用于保存節點的內容,節點內容類型和長度由encoding決定。 二ht(hashtable) 哈希表又或者叫字典dict (1)hashtable 被稱為字典(dictionary),它是一個數組+鏈表的結構 (2)為什么有 ht\[0\] 和 ht\[1\] 兩個hash表,是為了擴容 字典、哈希表和哈希表節點關系圖: ![](https://img.kancloud.cn/bd/3c/bd3c2ad06e45d69c64c27dadb6683cef_1133x592.png) 1.字典 ![](https://img.kancloud.cn/4e/e6/4ee6187ad2b0a9556f64489bf85733b3_1202x531.png) * type屬性是一個指向dictType結構的指針,每個dictType結構保存了一簇用于操作特定類型鍵值對的函數; ![](https://img.kancloud.cn/1d/59/1d5971c24e8b1d33e4d4652b55b1397d_268x301.png) * privdata屬性保存了需要傳給那些類型特定函數的可選參數; * ht屬性是一個包含兩個項的數組,數組中的每個項都是一個dictht哈希表,ht\[1\]只有在對ht\[0\]哈希表進行rehash操作時使用; * trehashidx屬性是rehash索引,沒有進行rehash操作時值都為-1. 2.哈希表 ![](https://img.kancloud.cn/39/d3/39d3dc6a801fcda2533cba6ac67167fc_966x511.png) * table屬性是一個數組,數組中的每個元素都是一個指向哈希表節點的指針,每個節點都保存著一個鍵值對; * size屬性記錄了哈希表的大小,也就是table數組的大小; * sizemask屬性的值總是等于size-1,這個屬性和哈希值一起決定一個鍵應該被放到table數組的那個索引上面; * used屬性記錄了哈希表目前已有節點的數量。 3.哈希表節點 ![](https://img.kancloud.cn/0c/9a/0c9a03f34a1d5742371d6f82ef87705b_1021x519.png) * key屬性保存著鍵值對中的鍵; * v屬性保存著鍵值對中的值,其中值用union定義,支持三種數據類型。 * next屬性是指向另一個哈希表節點的指針,這個指針可以將多個哈希值相同的鍵值對連接在一起,以此來解決鍵沖突的問題。 (2)哈希計算 ①、哈希算法:**Redis計算哈希值和索引值方法如下: 1、使用字典設置的哈希函數,計算鍵 key 的哈希值hash = dict-&gt;type-&gt;hashFunction(key); 2、使用哈希表的sizemask屬性和第一步得到的哈希值,計算索引值index = hash &amp; dict-&gt;ht[x].sizemask; ②、解決哈希沖突:**這個問題上面我們介紹了,方法是鏈地址法。通過字典里面的 \*next 指針指向下一個具有相同索引值的哈希表節點。 ③、擴容和收縮:**當哈希表保存的鍵值對太多或者太少時,就要通過 rerehash(重新散列)來對哈希表進行相應的擴展或者收縮。具體步驟: 1、如果執行擴展操作,會基于原哈希表創建一個大小等于 ht\[0\].used\*2n 的哈希表(也就是每次擴展都是根據原哈希表已使用的空間擴大一倍創建另一個哈希表)。相反如果執行的是收縮操作,每次收縮是根據已使用空間縮小一倍創建一個新的哈希表。 2、重新利用上面的哈希算法,計算索引值,然后將鍵值對放到新的哈希表位置上。 3、所有鍵值對都遷徙完畢后,釋放原哈希表的內存空間。 ④、觸發擴容的條件:** 1、服務器目前沒有執行 BGSAVE 命令或者 BGREWRITEAOF 命令,并且負載因子大于等于1。 2、服務器目前正在執行 BGSAVE 命令或者 BGREWRITEAOF 命令,并且負載因子大于等于5。 ps:負載因子 = 哈希表已保存節點數量 / 哈希表大小。 ⑤、漸近式 rehash** 什么叫漸進式 rehash?也就是說擴容和收縮操作不是一次性、集中式完成的,而是分多次、漸進式完成的。如果保存在Redis中的鍵值對只有幾個幾十個,那么 rehash 操作可以瞬間完成,但是如果鍵值對有幾百萬,幾千萬甚至幾億,那么要一次性的進行 rehash,勢必會造成Redis一段時間內不能進行別的操作。所以Redis采用漸進式 rehash,這樣在進行漸進式rehash期間,字典的刪除查找更新等操作可能會在兩個哈希表上進行,第一個哈希表沒有找到,就會去第二個哈希表上進行查找。但是進行 增加操作,一定是在新的哈希表上進行的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看