本篇內(nèi)容主要講解“Redis哈希結(jié)構(gòu)內(nèi)存模型是怎樣的”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Redis哈希結(jié)構(gòu)內(nèi)存模型是怎樣的”吧!
為子長(zhǎng)等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及子長(zhǎng)網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、子長(zhǎng)網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!哈希類型內(nèi)部編碼詳情
對(duì)于 Redis的常用 5 種數(shù)據(jù)類型(String、Hash、List、Set、sorted set),每種數(shù)據(jù)類型都提供了 最少兩種 內(nèi)部的編碼格式,而且每個(gè)數(shù)據(jù)類型內(nèi)部編碼方式的選擇 對(duì)用戶是完全透明的,Redis會(huì)根據(jù)數(shù)據(jù)量自適應(yīng)地選擇較優(yōu)化的內(nèi)部編碼格式。
如果想查看某個(gè)鍵的內(nèi)部編碼格式,可以使用 OBJECT ENCODING keyname 指令來進(jìn)行,比如:
127.0.0.1:6379> 127.0.0.1:6379> set foo bar OK127.0.0.1:6379> 127.0.0.1:6379> object encoding foo // 查看某個(gè)Redis鍵值的編碼"embstr"127.0.0.1:6379> 127.0.0.1:6379>
對(duì)于使用最為頻繁的 Hash類型,其內(nèi)部編碼方式可能有兩種:
OBJ_ENCODING_ZIPLIST(壓縮列表)
OBJ_ENCODING_HT(哈希表)
Redis 會(huì)根據(jù)數(shù)據(jù)量的情況來自適應(yīng)地選擇這兩種編碼方式中 較優(yōu) 的一種,而這一切對(duì)用戶完全透明。
在 數(shù)據(jù)條目較少,數(shù)據(jù)值較小 的時(shí)候 Redis會(huì)采用 壓縮列表(OBJ_ENCODING_ZIPLIST)編碼方式進(jìn)行存儲(chǔ)。這里成員"較少",成員值"較小"的標(biāo)準(zhǔn)可以通過如下配置項(xiàng)進(jìn)行配置:
hash-max-ziplist-entries 512hash-max-ziplist-value 64
Redis 默認(rèn)給出了默認(rèn)值,當(dāng)然用戶可根據(jù)實(shí)際情況自行配置。
當(dāng) Hash類型鍵的字段個(gè)數(shù) < hash-max-ziplist-entries 并且 每個(gè)字段名和字段值的長(zhǎng)度 < hash-max-ziplist-value 時(shí),Redis 會(huì)使用 OBJ_ENCODING_ZIPLIST來存儲(chǔ)該鍵,反之則會(huì)轉(zhuǎn)換為 OBJ_ENCODING_HT的編碼方式。
口說無憑,我們不妨先來做個(gè)實(shí)驗(yàn)感受一下吧:
很明顯該實(shí)驗(yàn)驗(yàn)證了當(dāng) 字段值長(zhǎng)度大于64時(shí),編碼格式會(huì)由 ZIPLIST方式切換為 Hashtable方式。
源碼之前,了無秘密,我們?cè)賮砜匆幌翿edis關(guān)于這部分切換的源碼實(shí)現(xiàn),那就理解得更加清楚了:
下面詳解 OBJ_ENCODING_ZIPLIST 和 OBJ_ENCODING_HT 這兩種編碼格式的內(nèi)部存儲(chǔ)模型,知道了其各自特點(diǎn)和優(yōu)缺點(diǎn),自然也就明白了Redis內(nèi)部使用它們的意圖。
OBJ_ENCODING_ZIPLIST 編碼
Ziplist 壓縮列表是一種緊湊編碼格式,總體思想是時(shí)間換空間,即以部分讀寫性能為代價(jià),來換取極高的內(nèi)存空間利用率,因此只會(huì)用于 字段個(gè)數(shù)少,且字段值也較小 的場(chǎng)景。給大家推薦一個(gè)架構(gòu)交流群:698581634 進(jìn)群即可免費(fèi)獲取資料。
壓縮列表內(nèi)存利用率極高的原因與其連續(xù)內(nèi)存的特性是分不開的,其典型的內(nèi)存結(jié)構(gòu)可以用下圖形象地展示出來:
所以如果用 Ziplist來存儲(chǔ) Redis的散列類型的話,元素的排列方式就變成了如下圖所示的形象示意圖:即key和value都是邏輯連續(xù)內(nèi)存:
OBJ_ENCODING_HT 編碼
OBJ_ENCODING_HT 這種編碼方式內(nèi)部才是真正的哈希表結(jié)構(gòu),或稱為字典結(jié)構(gòu),其可以實(shí)現(xiàn)O(1)復(fù)雜度的讀寫操作,因此效率很高。
在 Redis內(nèi)部,從 OBJ_ENCODING_HT類型到底層真正的散列表數(shù)據(jù)結(jié)構(gòu)是一層層嵌套下去的,關(guān)系如下:
這一關(guān)系我們可以從 Redis哈希表定義部分的源碼來看出:
下面來詳解一下各個(gè)部分:
關(guān)于哈希節(jié)點(diǎn)(dictEntry)
關(guān)于哈希表(dictht)和字典(dict)
關(guān)于dictType
Redis如何計(jì)算Hash值
Redis計(jì)算Hash的源代碼如下:
這是一個(gè) C語言宏定義,其實(shí)幕后真正承擔(dān) Hash值計(jì)算的是上面介紹的 dictType結(jié)構(gòu)體中的函數(shù)指針 hashFunction。給大家推薦一個(gè)架構(gòu)交流群:698581634 進(jìn)群即可免費(fèi)獲取資料。
而該 hashFunction函數(shù)指針在初始化時(shí)會(huì)對(duì)應(yīng)被賦值為一個(gè)個(gè)真實(shí)的計(jì)算 Hash值的實(shí)際函數(shù),就像下面這樣:
Redis如何計(jì)算存取索引Index值
Index值的計(jì)算依賴于上面計(jì)算得出的 Hash值,代碼如下:
到此,相信大家對(duì)“Redis哈希結(jié)構(gòu)內(nèi)存模型是怎樣的”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
名稱欄目:Redis哈希結(jié)構(gòu)內(nèi)存模型是怎樣的-創(chuàng)新互聯(lián)
分享鏈接:http://jinyejixie.com/article4/pipoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、面包屑導(dǎo)航、搜索引擎優(yōu)化、手機(jī)網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷推廣、網(wǎng)站營(yíng)銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容