Redis链表实现
鏈表在 Redis 中的應(yīng)用非常廣泛, 比如列表鍵的底層實(shí)現(xiàn)之一就是鏈表: 當(dāng)一個(gè)列表鍵包含了數(shù)量比較多的元素, 又或者列表中包含的元素都是比較長的字符串時(shí), Redis 就會(huì)使用鏈表作為列表鍵的底層實(shí)現(xiàn)。除了鏈表鍵之外, 發(fā)布與訂閱、慢查詢、監(jiān)視器等功能也用到了鏈表, Redis 服務(wù)器本身還使用鏈表來保存多個(gè)客戶端的狀態(tài)信息, 以及使用鏈表來構(gòu)建客戶端輸出緩沖區(qū)(output buffer)。
redis實(shí)現(xiàn)鏈表的數(shù)據(jù)結(jié)構(gòu):
//鏈表節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu) typedef struct listNode {struct listNode *prev; //指向上一個(gè)節(jié)點(diǎn)struct listNode *next; //指向下一個(gè)節(jié)點(diǎn)void *value; //節(jié)點(diǎn)保存的信息 } listNode; //鏈表迭代器 typedef struct listIter {listNode *next; //指向下一個(gè)將要訪問的節(jié)點(diǎn)int direction; //訪問的方向 } listIter; //鏈表數(shù)據(jù)結(jié)構(gòu) typedef struct list {listNode *head; //表頭listNode *tail; //表尾void *(*dup)(void *ptr); //dup函數(shù)指針void (*free)(void *ptr); //free函數(shù)指針int (*match)(void *ptr, void *key); //match函數(shù)指針unsigned long len; //表的長度 } list;由上面的數(shù)據(jù)結(jié)構(gòu)可以知道多個(gè)listnode可以組成一個(gè)list雙向鏈表,這和數(shù)據(jù)結(jié)構(gòu)中所學(xué)的一樣。
list結(jié)構(gòu)中的三個(gè)函數(shù)指針是用來實(shí)現(xiàn)c++中的“多態(tài)”,由于listnode中的value指針指向的內(nèi)容不同,導(dǎo)致對(duì)應(yīng)的dup,free,match也會(huì)有所不同,這三個(gè)函數(shù)的作為分別如下:
- dup?函數(shù)用于復(fù)制鏈表節(jié)點(diǎn)所保存的值;
- free?函數(shù)用于釋放鏈表節(jié)點(diǎn)所保存的值;
- match?函數(shù)則用于對(duì)比鏈表節(jié)點(diǎn)所保存的值和另一個(gè)輸入值是否相等。
上面實(shí)現(xiàn)的雙向鏈表和我們在數(shù)據(jù)結(jié)構(gòu)中學(xué)習(xí)的雙向鏈表本質(zhì)是一致的,但這個(gè)鏈表更加的通用。listnode保存的內(nèi)容是沒有要求的,它只負(fù)責(zé)執(zhí)行內(nèi)容的地址,至于內(nèi)容是用什么數(shù)據(jù)結(jié)構(gòu)保存的并不關(guān)心,真正需要關(guān)系內(nèi)容數(shù)據(jù)機(jī)構(gòu)的是dup,free和match函數(shù),這樣就很類似于c++中的“多態(tài)”。
?
總結(jié)
 
                            
                        - 上一篇: 基本文件上传漏洞攻击实验
- 下一篇: ecos内核概览--bakayi译
