日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 工業(yè)控制 > 電子設(shè)計(jì)自動(dòng)化

ziplist是用一個(gè)字符串來(lái)實(shí)現(xiàn)的雙向鏈表結(jié)構(gòu),顧名思義,使用ziplist可以減少雙向鏈表的存儲(chǔ)空間,主要是節(jié)省了鏈表指針的存儲(chǔ),如果存儲(chǔ)指向上一個(gè)鏈表結(jié)點(diǎn)和指向下一個(gè)鏈表結(jié)點(diǎn)的指針需要8個(gè)字節(jié),而轉(zhuǎn)化成存儲(chǔ)上一個(gè)結(jié)點(diǎn)長(zhǎng)度和當(dāng)前結(jié)點(diǎn)長(zhǎng)度在大多數(shù)情況下可以節(jié)省很多空間(最好的情況下只需2個(gè)字節(jié))。但是每次向鏈表增加元素都需要重新分配內(nèi)存。

ziplist中的結(jié)構(gòu)體typedef struct zlentry {unsigned int prevrawlensize, prevrawlen;unsigned int lensize, len;unsigned int headersize;unsigned char encoding;unsigned char *p;} zlentry;Prevrawlen:上個(gè)鏈表結(jié)點(diǎn)占用的長(zhǎng)度Prevrawlensize:上個(gè)鏈表結(jié)點(diǎn)長(zhǎng)度的存儲(chǔ)占用的字節(jié)數(shù)Len:當(dāng)前鏈表結(jié)點(diǎn)占用的長(zhǎng)度Lensize:當(dāng)前鏈表結(jié)點(diǎn)長(zhǎng)度的存儲(chǔ)占用的字節(jié)數(shù)Headersize:當(dāng)前鏈表結(jié)點(diǎn)的頭部大小, headersize = prevrawlensize + lensizeEncoding:當(dāng)前鏈表結(jié)點(diǎn)長(zhǎng)度(即字段len)使用的編碼類(lèi)型P:指向當(dāng)前結(jié)點(diǎn)起始位置的指針Ziplist的存儲(chǔ)結(jié)構(gòu)鏈表存儲(chǔ)結(jié)構(gòu)Zlbytes:一個(gè)4字節(jié)的無(wú)符號(hào)整型,存儲(chǔ)的是整個(gè)ziplist占用的字節(jié)數(shù),用于重分配內(nèi)存時(shí)使用。Zltail:一個(gè)4字節(jié)的無(wú)符號(hào)整型,存儲(chǔ)的是鏈表最后一個(gè)結(jié)點(diǎn)的偏移值,即鏈表開(kāi)頭地址+zltail即為最后一個(gè)結(jié)點(diǎn)的起始地址Zllen:一個(gè)2字節(jié)的無(wú)符號(hào)整型,存儲(chǔ)的是鏈表中存儲(chǔ)的結(jié)點(diǎn)數(shù),當(dāng)這個(gè)值存儲(chǔ)的是2字節(jié)無(wú)符號(hào)整型的最大值時(shí),需要遍歷鏈表獲取鏈表的結(jié)點(diǎn)數(shù)Entry:鏈表結(jié)點(diǎn),鏈表結(jié)點(diǎn)的存儲(chǔ)格式見(jiàn)結(jié)點(diǎn)存儲(chǔ)結(jié)構(gòu)Zlend:占用1字節(jié)的鏈表的結(jié)尾符,值為255相關(guān)的宏定義Ziplist.c: 89/* Utility macros */#define ZIPLIST_BYTES(zl) (*((uint32_t*)(zl)))#define ZIPLIST_TAIL_OFFSET(zl) (*((uint32_t*)((zl)+sizeof(uint32_t))))#define ZIPLIST_LENGTH(zl) (*((uint16_t*)((zl)+sizeof(uint32_t)*2)))#define ZIPLIST_HEADER_SIZE (sizeof(uint32_t)*2+sizeof(uint16_t))#define ZIPLIST_ENTRY_HEAD(zl) ((zl)+ZIPLIST_HEADER_SIZE)#define ZIPLIST_ENTRY_TAIL(zl) ((zl)+ZIPLIST_TAIL_OFFSET(zl))#define ZIPLIST_ENTRY_END(zl) ((zl)+ZIPLIST_BYTES(zl)-1)結(jié)點(diǎn)存儲(chǔ)結(jié)構(gòu)<上一個(gè)鏈表結(jié)點(diǎn)占用的長(zhǎng)度><當(dāng)前鏈表結(jié)點(diǎn)占用的長(zhǎng)度><當(dāng)前結(jié)點(diǎn)數(shù)據(jù)>上一個(gè)鏈表結(jié)點(diǎn)占用的長(zhǎng)度上一個(gè)鏈表結(jié)點(diǎn)占用的長(zhǎng)度占用的字節(jié)數(shù)根據(jù)編碼類(lèi)型而定當(dāng)長(zhǎng)度數(shù)據(jù)小于254使用一個(gè)字節(jié)存儲(chǔ),該字節(jié)存儲(chǔ)的數(shù)值就是該長(zhǎng)度,當(dāng)長(zhǎng)度數(shù)據(jù)大于等于254時(shí),使用5個(gè)字節(jié)存儲(chǔ),第一個(gè)字節(jié)的數(shù)值為254,表示接下來(lái)的4個(gè)字節(jié)才真正表示長(zhǎng)度當(dāng)前鏈表結(jié)點(diǎn)用的長(zhǎng)度存儲(chǔ)和數(shù)據(jù)存儲(chǔ)第一個(gè)字節(jié)的前兩位用于區(qū)分長(zhǎng)度存儲(chǔ)編碼類(lèi)型和數(shù)據(jù)編碼類(lèi)型,具體如下字符串類(lèi)型編碼|00pppppp|長(zhǎng)度小于等于63(2^6-1)字節(jié)的字符串,后6位用于存儲(chǔ)字符串長(zhǎng)度,長(zhǎng)度與類(lèi)型總共占用了1個(gè)字節(jié)|01pppppp|qqqqqqqq|長(zhǎng)度小于等于16383(2^14-1)字節(jié)的字符串,后14位用于存儲(chǔ)字符串長(zhǎng)度,長(zhǎng)度與類(lèi)型總共占用了2個(gè)字節(jié)|10______|qqqqqqqq|rrrrrrrr|ssssssss|tttttttt|長(zhǎng)度大于等于16384字節(jié)的字符串,后4個(gè)字節(jié)用于存儲(chǔ)字符串長(zhǎng)度,長(zhǎng)度與類(lèi)型總共占用了5個(gè)字節(jié)整型編碼|1100____|整型類(lèi)型,后2個(gè)字節(jié)存儲(chǔ)的值就是該整數(shù)|1101____|整型類(lèi)型,后4個(gè)字節(jié)存儲(chǔ)的值就是該整數(shù)|1110____|整型類(lèi)型,后8個(gè)字節(jié)存儲(chǔ)的值就是該整數(shù)相關(guān)的宏定義Ziplist.c:77/* Different encoding/length possibilities */#define ZIP_STR_06B (0 << 6)#define ZIP_STR_14B (1 << 6)#define ZIP_STR_32B (2 << 6)#define ZIP_INT_16B (0xc0 | 0<<4)#define ZIP_INT_32B (0xc0 | 1<<4)#define ZIP_INT_64B (0xc0 | 2<<4)/* Macro's to determine type */#define ZIP_IS_STR(enc) (((enc) & 0xc0) < 0xc0)#define ZIP_IS_INT(enc) (!ZIP_IS_STR(enc) && ((enc) & 0x30) < 0x30)ziplist提供的接口unsigned char *ziplistNew(void);創(chuàng)建一個(gè)ziplist返回創(chuàng)建的ziplist的指針unsigned char *ziplistPush(unsigned char *zl, unsigned char *s, unsigned int slen, int where);在ziplist的尾端或頭部添加一個(gè)結(jié)點(diǎn)zl是ziplist的指針s是待添加結(jié)點(diǎn)的值slen是待添加結(jié)點(diǎn)的值長(zhǎng)度返回最新的ziplist的指針unsigned char *ziplistIndex(unsigned char *zl, int index);根據(jù)索引獲取ziplist的結(jié)點(diǎn),封裝類(lèi)似數(shù)組接口zl是ziplist的指針index是索引,從0開(kāi)始,0即取鏈表的第一個(gè)結(jié)點(diǎn),index可以是負(fù)數(shù),負(fù)數(shù)表從后往前算,-1就是取鏈表的最后一個(gè)元素如果index處有結(jié)點(diǎn),則返回指向改結(jié)點(diǎn)的指針,否則返回NULLunsigned char *ziplistNext(unsigned char *zl, unsigned char *p);獲取ziplist的下一個(gè)結(jié)點(diǎn)zl是無(wú)用參數(shù)p是當(dāng)前結(jié)點(diǎn)指針如果還有下一個(gè)結(jié)點(diǎn),則返回下一個(gè)結(jié)點(diǎn)的指針,否則返回NULLunsigned char *ziplistPrev(unsigned char *zl, unsigned char *p);獲取ziplist的上一個(gè)結(jié)點(diǎn)zl是ziplist的指針p是當(dāng)前結(jié)點(diǎn)指針如果還有上一個(gè)結(jié)點(diǎn),則返回上一個(gè)結(jié)點(diǎn)的指針,否則返回NULLunsigned int ziplistGet(unsigned char *p, unsigned char **sval, unsigned int *slen, long long *lval);獲取p指向的當(dāng)前結(jié)點(diǎn)的值p是指向當(dāng)前結(jié)點(diǎn)的指針sval保存獲取到的當(dāng)前結(jié)點(diǎn)的值的指針slen是獲取到的當(dāng)前結(jié)點(diǎn)的值的長(zhǎng)度lval是當(dāng)值是整型時(shí)保存返回的數(shù)值如果p指向的結(jié)點(diǎn)是合法結(jié)點(diǎn)返回1,否則返回0unsigned char *ziplistInsert(unsigned char *zl, unsigned char *p, unsigned char *s, unsigned int slen);在指針p指向的位置插入一個(gè)結(jié)點(diǎn)zl是ziplist的指針p是待插入結(jié)點(diǎn)的位置s是待插入結(jié)點(diǎn)的值slen是待插入結(jié)點(diǎn)的值的長(zhǎng)度返回最新的ziplist的指針unsigned char *ziplistDelete(unsigned char *zl, unsigned char **p);刪掉*p指向的結(jié)點(diǎn)zl是ziplist的指針p是一個(gè)value-result參數(shù),傳入需刪除的結(jié)點(diǎn),返回被刪除結(jié)點(diǎn)下一個(gè)結(jié)點(diǎn)的指針?lè)祷刈钚碌膠iplist的指針unsigned char *ziplistDeleteRange(unsigned char *zl, unsigned int index, unsigned int num);刪除連續(xù)的一批結(jié)點(diǎn)zl是ziplist的指針index是開(kāi)始刪除的索引num是刪除的個(gè)數(shù)返回最新的ziplist的指針unsigned int ziplistCompare(unsigned char *p, unsigned char *s, unsigned int slen);p指向的結(jié)點(diǎn)的值和s對(duì)應(yīng)的值做比較p是ziplist結(jié)點(diǎn)的指針s是呆比較的值slen是s的長(zhǎng)度相等返回1,否則返回0unsigned int ziplistLen(unsigned char *zl);取ziplist鏈表中元素的個(gè)數(shù)zl是ziplist的指針?lè)祷貁iplist鏈表中元素的個(gè)數(shù)size_t ziplistBlobLen(unsigned char *zl);取ziplist鏈表占用的字節(jié)數(shù)zl是ziplist的指針?lè)祷貁iplist鏈表占用的字節(jié)數(shù)

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

萬(wàn)用表又稱(chēng)多用表,是強(qiáng)弱電維修不可或缺的儀表,無(wú)線電維修、電腦主板維修等都離不開(kāi)它。萬(wàn)用表基本功能有交直流電壓、直流電流和電阻等

關(guān)鍵字: 指針式萬(wàn)用表 內(nèi)部結(jié)構(gòu) 直流電流

iPhone 14是蘋(píng)果公司于2022年9月8日發(fā)布的手機(jī)產(chǎn)品。 [6] iPhone 14搭載6.1英寸OLED屏幕材質(zhì),配有藍(lán)色,紫色,午夜色,星光色,紅色五款顏色,長(zhǎng)度約146.7mm、寬度約71.5mm、厚度約7...

關(guān)鍵字: iPhone 14 內(nèi)部結(jié)構(gòu) 散熱系統(tǒng)

在下述的內(nèi)容中,小編將會(huì)對(duì)交換機(jī)的相關(guān)消息予以報(bào)道,如果交換機(jī)是您想要了解的焦點(diǎn)之一,不妨和小編共同閱讀這篇文章哦。

關(guān)鍵字: 路由器 交換機(jī) 內(nèi)部結(jié)構(gòu)

為了增進(jìn)大家對(duì)電子管的認(rèn)識(shí),本文將基于兩方面介紹電子管:1.電子管及其內(nèi)部結(jié)構(gòu)、2.電子管老化問(wèn)題分析。

關(guān)鍵字: 電子管 指數(shù) 內(nèi)部結(jié)構(gòu)

前言說(shuō)到redis,可能大家的腦海中蹦出的關(guān)鍵詞是:NoSQL、KV、高性能、緩存等。但今天的文章從另一個(gè)角度——微服務(wù)來(lái)展開(kāi)。這篇文章的起因也是源自一次面試經(jīng)歷,在面試一位來(lái)自陌陌的候選人(就是那個(gè)交友的陌陌)時(shí),他提...

關(guān)鍵字: redis

面試官:你們系統(tǒng)是怎么實(shí)現(xiàn)分布式鎖的?我:我們使用了redis的分布式鎖。具體做法是后端接收到請(qǐng)求后加入一個(gè)分布式鎖,如果加鎖成功,就執(zhí)行業(yè)務(wù),如果加鎖失敗就等待鎖或者拒絕請(qǐng)求。業(yè)務(wù)執(zhí)行完成后釋放鎖。面試官:能說(shuō)一下具體...

關(guān)鍵字: 分布式 redis

進(jìn)程請(qǐng)求分布式鎖時(shí)一般包含三個(gè)階段:1.進(jìn)程請(qǐng)求獲取鎖;2.獲取到鎖的進(jìn)程持有鎖并執(zhí)行業(yè)務(wù)邏輯;3.獲取到鎖的進(jìn)程釋放鎖;下文會(huì)按照這個(gè)三個(gè)階段進(jìn)行分析。單機(jī)Redis獲取鎖從一開(kāi)始的請(qǐng)求進(jìn)程通過(guò)SETNX命令獲取鎖;1...

關(guān)鍵字: redis zookeeper 分布式鎖

經(jīng)過(guò)前面兩篇文章《JSON Web Token - 在Web應(yīng)用間安全地傳遞信息》《八幅漫畫(huà)理解使用JSON Web Token設(shè)計(jì)單點(diǎn)登錄系統(tǒng)》的科普,相信大家應(yīng)該已經(jīng)知道了 JWT 協(xié)議是什么了。

關(guān)鍵字: JWT redis session

我們來(lái)思考一個(gè)問(wèn)題,當(dāng)我們?cè)诰幊唐髦邪岩粭l指令寫(xiě)進(jìn)單片機(jī)內(nèi)部,然后取下單片機(jī),單片機(jī)就可以執(zhí)行這條指令,那么這條指令一定保存在單片機(jī)的某個(gè)地方,并且這個(gè)地方在單片機(jī)掉電后依然可以保持這條指令不會(huì)丟失,這是個(gè)什么地方呢?

關(guān)鍵字: 單片機(jī) 指令 內(nèi)部結(jié)構(gòu)

在這篇文章中,小編將為大家?guī)?lái)電子管、電子管內(nèi)部結(jié)構(gòu)的相關(guān)報(bào)道。

關(guān)鍵字: 電子管 內(nèi)部結(jié)構(gòu) 柵極
關(guān)閉