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