下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、面試官:你了解過redis對象底層實(shí)現(xiàn)嗎面試官:你了解過redis對象底層實(shí)現(xiàn)嗎上一章我們講了redis的底層數(shù)據(jù)結(jié)構(gòu),不了解的人可能會(huì)有疑問:這個(gè)和平常用的五大對象有啥關(guān)系呢?這一章我們就主要說明他們所建立的聯(lián)系??催@個(gè)文章之前,假如對ziplist、skiplist、intset等數(shù)據(jù)結(jié)構(gòu)不認(rèn)識的話,建議先回顧一下上一章節(jié):面試官:你看過redis數(shù)據(jù)結(jié)構(gòu)底層實(shí)現(xiàn)嗎?0.五類對象分離是什么五類對象就是我們常用的string、list、set、zset、hash1.為什么要有對象我們平常主要是通過操作對象的api來操作redis,而不是通過它的調(diào)用它底層數(shù)據(jù)結(jié)構(gòu)來完成(外觀模式)。但我們還需
2、要了解其底層,惟獨(dú)這樣才干寫最優(yōu)化高效的代碼。跟java一樣,對象使開發(fā)更便利簡潔,降低開發(fā)門檻。開發(fā)者不需要了解其復(fù)雜的底層api,挺直調(diào)用高層接口即可實(shí)現(xiàn)開發(fā)。redis按照對象類型來推斷指令是否違法,假如你setkeyvalue1value2就報(bào)錯(cuò)。對象下可以包含多種數(shù)據(jù)結(jié)構(gòu),使數(shù)據(jù)存儲(chǔ)越發(fā)多態(tài)化。(下面主講)reids基于對象做了垃圾回收(引用計(jì)數(shù)法)。對象帶有更豐盛的屬性,來協(xié)助redis實(shí)現(xiàn)更高級的功能。(比如對象的閑置時(shí)光)。2.redis對象(redisobject)源碼分析typedefstructredisobject/類型unsignedtype:4;/編碼unsigne
3、dencoding:4;/指向底層實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)的指針void*ptr;/.robj;type字段記錄對象類型。我們平常用的指令type,其實(shí)就是返回這個(gè)字段的屬性。127.0.0.1:6379>sethelloworldok127.0.0.1:6379>typehellostring127.0.0.1:6379>rpushlist123(integer)3127.0.0.1:6379>typelistlist.那type有多少中類型呢?看下面這個(gè)表:面試官:你了解過redis對象底層實(shí)現(xiàn)嗎encoding字段記錄對象用法的編碼(數(shù)據(jù)結(jié)構(gòu)),reids中稱數(shù)據(jù)結(jié)構(gòu)為enc
4、oding。我們可以這樣查看我們r(jià)edis對象中的encoding:127.0.0.1:6379>objectencodinghello"embstr"127.0.0.1:6379>objectencodinglist"quicklist".既然它是標(biāo)明該redisobject是用法的什么數(shù)據(jù)結(jié)構(gòu),那絕對也有個(gè)對應(yīng)的表:面試官:你了解過redis對象底層實(shí)現(xiàn)嗎我們可以看到,redis對對象的底層encoding分的很細(xì),string類型就有三個(gè),其它四個(gè)對象都分離有兩種不同的底層數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)。他們有一邏輯,就
5、是用ziplist、intset、embstr來實(shí)現(xiàn)少量的數(shù)據(jù),數(shù)據(jù)量一旦浩大,就會(huì)升級到skiplist、raw、linkedlist、ht來實(shí)現(xiàn),后面我會(huì)認(rèn)真講解。3.分離分析各個(gè)對象的底層編碼實(shí)現(xiàn)(數(shù)據(jù)結(jié)構(gòu))3.1字符串(string)字符串編碼有三個(gè):int、raw、embstr。3.1.1int當(dāng)string對象的值所有是數(shù)字,就會(huì)用法int編碼。127.0.0.1:6379>setnumber123455ok127.0.0.1:6379>objectencodingnumber"int"3.1.2embstr字符串或浮點(diǎn)數(shù)長度小于等于
6、39字節(jié),就會(huì)用法embstr編碼方式來存儲(chǔ),embstr存儲(chǔ)內(nèi)存普通很小,所以redis一次性分配且內(nèi)存延續(xù)(效率高)。127.0.0.1:6379>setshortstr"suwesuwesuwe"ok127.0.0.1:6379>objectencodingshortstr"embstr"3.1.2raw當(dāng)一個(gè)字符串或浮點(diǎn)數(shù)長度大于39字節(jié),就用法sds來保存,編碼為raw,因?yàn)椴淮_定值的字節(jié)大小,所以鍵和值各分配各的,所以就分配兩次內(nèi)存(回收也是兩次),同理它一定不是內(nèi)存延續(xù)的。127.0.0.1:63
7、79>setlongstr"helloeveryone,wedontneedtosleeparoundtogoaheard!doyouthink?"ok127.0.0.1:6379>objectencodinglongstr"raw"3.1.3編碼轉(zhuǎn)換前面說過,redis會(huì)自動(dòng)對編碼舉行轉(zhuǎn)換來適應(yīng)和優(yōu)化數(shù)據(jù)的存儲(chǔ)。int->raw條件:數(shù)字對象舉行append字母,就會(huì)發(fā)生轉(zhuǎn)換。127.0.0.1:6379>objectencodingnumber"int"127
8、.0.0.1:6379>appendnumber"isaluckynumber"(integer)24127.0.0.1:6379>objectencodingnumber"raw"embstr->raw條件:對embstr舉行修改,redis會(huì)先將其轉(zhuǎn)換成raw,然后才舉行修改。所以embstr事實(shí)上是只讀性質(zhì)的。127.0.0.1:6379>objectencodingshortstr"embstr"127.0.0.1:6379>appendshorts
9、tr"(hhh"(integer)18127.0.0.1:6379>objectencodingshortstr"raw"3.2列表(list)列表對象編碼可以是:ziplist或linkedlist。ziplist壓縮列表不知道大家還記得不,就是zlbyteszltailzllenentry1entry2.end結(jié)構(gòu),entry節(jié)點(diǎn)里有pre-length、encoding、content屬性,遺忘的可以返回去看下。linkedlist,類似雙向鏈表,也是上一章的學(xué)問。3.2.1編碼轉(zhuǎn)換ziplist->li
10、nkedlist條件:列表對象的全部字符串元素的長度大于等于64字節(jié)&列表元素?cái)?shù)大于等于512.反之,小于64和小于512會(huì)用法ziplist而不是用linkedlist。這個(gè)閾值是可以修改的,修改選項(xiàng):list-max-ziplist-value和list-max-ziplist-entriess3.3哈希(hash)哈希對象的編碼有:ziplist和hashtable3.3.1編碼轉(zhuǎn)換ziplist->hashtable條件:哈希對象全部鍵和值字符串長度大于等于64字節(jié)&鍵值對數(shù)量大于等于512這個(gè)閾值也是可以修改的,修改選項(xiàng):hash-max-zip
11、list-value和hash-max-ziplist-entriess3.4.集合(set)集合對象的編碼有:intset和hashtable3.4.1intset集合對象全部元素都是整數(shù)集合對象元素?cái)?shù)不超過512個(gè)3.4.2編碼轉(zhuǎn)換intset->hashtable條件:元素不都是整數(shù)&元素?cái)?shù)大于等于5123.5.有序集合(zset)有序集合用到的編碼:ziplist和skiplist大家可能很奇怪阿,ziplist的entry中惟獨(dú)屬性content可以存放數(shù)據(jù),集合也是key-value形式,那怎么存儲(chǔ)呢?第一個(gè)節(jié)點(diǎn)保存key、其次個(gè)節(jié)點(diǎn)保存value以此類推.3
12、.5.1為什么要用這兩個(gè)編碼假如只用ziplist來實(shí)現(xiàn),無法做到元素的排序,不支持范圍查找,能做到元素的迅速查找。假如只用skiplist來實(shí)現(xiàn),無法做到迅速查找,但能做到元素排序、范圍操作。3.5.2編碼轉(zhuǎn)換ziplist->skiplist條件:有序集合元素?cái)?shù)>=128&含有元素的長度>=64這個(gè)閾值也是可以修改的,修改選項(xiàng):zset-max-ziplist-value和zset-max-ziplist-entriess4.垃圾回收為什么要說內(nèi)存回收呢,由于redisobject有一個(gè)字段:typedefstructredisobject/./引用計(jì)數(shù)i
13、ntrefcount;/.robj;redis的垃圾回收采納引用計(jì)數(shù)法(和jvm一樣),底層采納一個(gè)變量對對象的用法行為舉行計(jì)數(shù)。初始化為1對象被引用,+1對象引用消退,-1計(jì)數(shù)器=0,回收對象5.對象分享5.1對象分享的體現(xiàn)redis中,值是整數(shù)值且相等的兩個(gè)對象,redis會(huì)將該對象舉行分享,且引用計(jì)數(shù)+1redis啟動(dòng)會(huì)自動(dòng)生成0-9999的整數(shù)值放到內(nèi)存中來分享。5.2為什么要對象分享節(jié)省內(nèi)存5.3為什么不對字符串舉行分享成本太高。驗(yàn)證整數(shù)相等只需要o(1)的時(shí)光復(fù)雜度,而驗(yàn)證字符串要o(n).6.對象的空閑時(shí)長最后,redisobject還有一個(gè)字段,記錄了對象最后一次被拜訪的時(shí)光:typedefstructr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度礦產(chǎn)資源勘探投標(biāo)委托代理合同3篇
- 2024年度抵押權(quán)質(zhì)押合同范本(2024版)3篇
- 二零二五年度辦公室裝修工程節(jié)能減排協(xié)議2篇
- 網(wǎng)絡(luò)科技產(chǎn)品測試員合作協(xié)議
- 個(gè)人二手房買賣合同樣本與個(gè)人二手房買賣合同
- 2024年度車庫車位租賃稅收籌劃合同范本3篇
- 超高清視頻內(nèi)容制作服務(wù)合同
- 2024消防工程勞務(wù)分包及消防設(shè)施檢測合同3篇
- 一年級數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)匯編
- 農(nóng)業(yè)物聯(lián)網(wǎng)應(yīng)用合作協(xié)議
- JBT 7048-2011 滾動(dòng)軸承 工程塑料保持架 技術(shù)條件
- Pre-IPO階段融資策略研究
- 陶藝校本課程實(shí)施方案(教學(xué)資料)
- 2024年山東省機(jī)場管理集團(tuán)威海國際機(jī)場有限公司招聘筆試參考題庫含答案解析
- 國際貨物運(yùn)輸委托代理合同(中英文對照)全套
- 銀行反恐應(yīng)急預(yù)案及方案
- 關(guān)于推某某同志擔(dān)任教育系統(tǒng)實(shí)職領(lǐng)導(dǎo)職務(wù)的報(bào)告(職務(wù)晉升)
- 2023消防安全知識培訓(xùn)
- Exchange配置與規(guī)劃方案專項(xiàng)方案V
- 三年級上冊脫式計(jì)算練習(xí)200題及答案
- 新生兒腭裂護(hù)理查房課件
評論
0/150
提交評論