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

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

ziplist是用一個字符串來實現(xiàn)的雙向鏈表結(jié)構(gòu),顧名思義,使用ziplist可以減少雙向鏈表的存儲空間,主要是節(jié)省了鏈表指針的存儲,如果存儲指向上一個鏈表結(jié)點和指向下一個鏈表結(jié)點的指針需要8個字節(jié),而轉(zhuǎn)化成存儲上一個結(jié)點長度和當(dāng)前結(jié)點長度在大多數(shù)情況下可以節(jié)省很多空間(最好的情況下只需2個字節(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:上個鏈表結(jié)點占用的長度Prevrawlensize:上個鏈表結(jié)點長度的存儲占用的字節(jié)數(shù)Len:當(dāng)前鏈表結(jié)點占用的長度Lensize:當(dāng)前鏈表結(jié)點長度的存儲占用的字節(jié)數(shù)Headersize:當(dāng)前鏈表結(jié)點的頭部大小, headersize = prevrawlensize + lensizeEncoding:當(dāng)前鏈表結(jié)點長度(即字段len)使用的編碼類型P:指向當(dāng)前結(jié)點起始位置的指針Ziplist的存儲結(jié)構(gòu)鏈表存儲結(jié)構(gòu)Zlbytes:一個4字節(jié)的無符號整型,存儲的是整個ziplist占用的字節(jié)數(shù),用于重分配內(nèi)存時使用。Zltail:一個4字節(jié)的無符號整型,存儲的是鏈表最后一個結(jié)點的偏移值,即鏈表開頭地址+zltail即為最后一個結(jié)點的起始地址Zllen:一個2字節(jié)的無符號整型,存儲的是鏈表中存儲的結(jié)點數(shù),當(dāng)這個值存儲的是2字節(jié)無符號整型的最大值時,需要遍歷鏈表獲取鏈表的結(jié)點數(shù)Entry:鏈表結(jié)點,鏈表結(jié)點的存儲格式見結(jié)點存儲結(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é)點存儲結(jié)構(gòu)<上一個鏈表結(jié)點占用的長度><當(dāng)前鏈表結(jié)點占用的長度><當(dāng)前結(jié)點數(shù)據(jù)>上一個鏈表結(jié)點占用的長度上一個鏈表結(jié)點占用的長度占用的字節(jié)數(shù)根據(jù)編碼類型而定當(dāng)長度數(shù)據(jù)小于254使用一個字節(jié)存儲,該字節(jié)存儲的數(shù)值就是該長度,當(dāng)長度數(shù)據(jù)大于等于254時,使用5個字節(jié)存儲,第一個字節(jié)的數(shù)值為254,表示接下來的4個字節(jié)才真正表示長度當(dāng)前鏈表結(jié)點用的長度存儲和數(shù)據(jù)存儲第一個字節(jié)的前兩位用于區(qū)分長度存儲編碼類型和數(shù)據(jù)編碼類型,具體如下字符串類型編碼|00pppppp|長度小于等于63(2^6-1)字節(jié)的字符串,后6位用于存儲字符串長度,長度與類型總共占用了1個字節(jié)|01pppppp|qqqqqqqq|長度小于等于16383(2^14-1)字節(jié)的字符串,后14位用于存儲字符串長度,長度與類型總共占用了2個字節(jié)|10______|qqqqqqqq|rrrrrrrr|ssssssss|tttttttt|長度大于等于16384字節(jié)的字符串,后4個字節(jié)用于存儲字符串長度,長度與類型總共占用了5個字節(jié)整型編碼|1100____|整型類型,后2個字節(jié)存儲的值就是該整數(shù)|1101____|整型類型,后4個字節(jié)存儲的值就是該整數(shù)|1110____|整型類型,后8個字節(jié)存儲的值就是該整數(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)建一個ziplist返回創(chuàng)建的ziplist的指針unsigned char *ziplistPush(unsigned char *zl, unsigned char *s, unsigned int slen, int where);在ziplist的尾端或頭部添加一個結(jié)點zl是ziplist的指針s是待添加結(jié)點的值slen是待添加結(jié)點的值長度返回最新的ziplist的指針unsigned char *ziplistIndex(unsigned char *zl, int index);根據(jù)索引獲取ziplist的結(jié)點,封裝類似數(shù)組接口zl是ziplist的指針index是索引,從0開始,0即取鏈表的第一個結(jié)點,index可以是負數(shù),負數(shù)表從后往前算,-1就是取鏈表的最后一個元素如果index處有結(jié)點,則返回指向改結(jié)點的指針,否則返回NULLunsigned char *ziplistNext(unsigned char *zl, unsigned char *p);獲取ziplist的下一個結(jié)點zl是無用參數(shù)p是當(dāng)前結(jié)點指針如果還有下一個結(jié)點,則返回下一個結(jié)點的指針,否則返回NULLunsigned char *ziplistPrev(unsigned char *zl, unsigned char *p);獲取ziplist的上一個結(jié)點zl是ziplist的指針p是當(dāng)前結(jié)點指針如果還有上一個結(jié)點,則返回上一個結(jié)點的指針,否則返回NULLunsigned int ziplistGet(unsigned char *p, unsigned char **sval, unsigned int *slen, long long *lval);獲取p指向的當(dāng)前結(jié)點的值p是指向當(dāng)前結(jié)點的指針sval保存獲取到的當(dāng)前結(jié)點的值的指針slen是獲取到的當(dāng)前結(jié)點的值的長度lval是當(dāng)值是整型時保存返回的數(shù)值如果p指向的結(jié)點是合法結(jié)點返回1,否則返回0unsigned char *ziplistInsert(unsigned char *zl, unsigned char *p, unsigned char *s, unsigned int slen);在指針p指向的位置插入一個結(jié)點zl是ziplist的指針p是待插入結(jié)點的位置s是待插入結(jié)點的值slen是待插入結(jié)點的值的長度返回最新的ziplist的指針unsigned char *ziplistDelete(unsigned char *zl, unsigned char **p);刪掉*p指向的結(jié)點zl是ziplist的指針p是一個value-result參數(shù),傳入需刪除的結(jié)點,返回被刪除結(jié)點下一個結(jié)點的指針返回最新的ziplist的指針unsigned char *ziplistDeleteRange(unsigned char *zl, unsigned int index, unsigned int num);刪除連續(xù)的一批結(jié)點zl是ziplist的指針index是開始刪除的索引num是刪除的個數(shù)返回最新的ziplist的指針unsigned int ziplistCompare(unsigned char *p, unsigned char *s, unsigned int slen);p指向的結(jié)點的值和s對應(yīng)的值做比較p是ziplist結(jié)點的指針s是呆比較的值slen是s的長度相等返回1,否則返回0unsigned int ziplistLen(unsigned char *zl);取ziplist鏈表中元素的個數(shù)zl是ziplist的指針返回ziplist鏈表中元素的個數(shù)size_t ziplistBlobLen(unsigned char *zl);取ziplist鏈表占用的字節(jié)數(shù)zl是ziplist的指針返回ziplist鏈表占用的字節(jié)數(shù)

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

萬用表又稱多用表,是強弱電維修不可或缺的儀表,無線電維修、電腦主板維修等都離不開它。萬用表基本功能有交直流電壓、直流電流和電阻等

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

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

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

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

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

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

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

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

關(guān)鍵字: redis

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

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

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

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

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

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

我們來思考一個問題,當(dāng)我們在編程器中把一條指令寫進單片機內(nèi)部,然后取下單片機,單片機就可以執(zhí)行這條指令,那么這條指令一定保存在單片機的某個地方,并且這個地方在單片機掉電后依然可以保持這條指令不會丟失,這是個什么地方呢?

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

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

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