網站首頁 編程語言 正文
1. 概述
-
鏈表提供了高效的節點重排能力,以及順序性的節點訪問方式,并且可以通過增刪節點來靈活地調整鏈表的長度。
-
作為一種常用數據結構,鏈表內置在很多高級的編程語言里面,因為Redis使用的C語言并沒有內置這種數據結構,所以Redis構建了自己的鏈表實現。
-
鏈表在Redis 中的應用非常廣泛,比如列表鍵的底層實現之一就是鏈表。當一個列表鍵包含了數量比較多的元素,又或者列表中包含的元素都是比較長的字符串時,Redis就會使用鏈表作為列表鍵的底層實現。
-
除了鏈表鍵之外,發布與訂閱、慢查詢、監視器等功能也用到了鏈表,Redis服務器本身還使用鏈表來保存多個客戶端的狀態信息,以及使用鏈表來構建客戶端輸出緩沖區output buffer )。
2. 鏈表和鏈表節點的實現
- 每個鏈表節點使用一個adlist.h/ listNode結構來表示
typedef struct listNode {
//前置節點
struct listNode * prev;
//后置節點
struct listNode * next;
//節點的值
void * value;
}listNode;
- 僅有多個鏈表節點可以組成鏈表
- ?使用adlist.h/list來持有鏈表,操作起來會更方便
list結構為鏈表提供了表頭指針head、表尾指針tail,以及鏈表長度計數器len,而dup、 free和 match 成員則是用于實現多態鏈表所需的類型特定函數:
- dup函數用于復制鏈表節點所保存的值
- free函數用于釋放鏈表節點所保存的值
- match函數則用于對比鏈表節點所保存的值和另一個輸入值是否相等
typedef struct list {
//表頭節點
listNode * head;
//表尾節點
listNode * tail;
//鏈表所包含的節點數量
unsigned long len;
//節點值復制函數
void * ( *dup) (void *ptr);
//節點值釋放函數
void (*free) (void *ptr);
//節點值對比函數
int (*match) (void *ptr,void *key);
} list;
如下一個list結構和三個listNode結構組成的鏈表
- ?Redis中鏈表實現的特性總結
雙端:鏈表節點帶有prev和next指針,獲取某個節點的前置節點和后置節點的復雜度都是O(1)。
無環:表頭節點的prev指針和表尾節點的next指針都指向NULL,對鏈表的訪問以NULL為終點。
帶表頭指針和表尾指針:通過list結構的head指針和tail指針,程序獲取鏈表的表頭節點和表尾節點的復雜度為O(1)。
帶鏈表長度計數器:程序使用list結構的len屬性來對list持有的鏈表節點進行計數,程序獲取鏈表中節點數量的復雜度為O(1)。
多態:鏈表節點使用void*指針來保存節點值,并且可以通過list結構的dup、free、match三個屬性為節點值設置類型特定函數,所以鏈表可以用于保存各種不同類型的值。
?3. 鏈表和鏈表節點的API
- 常用的API如下表
原文鏈接:https://blog.csdn.net/weixin_56637697/article/details/131637550
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2023-01-21 Go語言ORM框架構造查詢條件示例詳解_Golang
- 2022-09-04 Python運行出現DeprecationWarning的問題及解決_python
- 2022-09-15 Python利用psutil實現獲取硬件,網絡和進程信息_python
- 2022-09-01 MongoDB實現查詢、分頁和排序操作以及游標的使用_MongoDB
- 2022-04-01 k8s使用docker作為運行時卡死解決辦法
- 2024-03-25 解決idea配置自定義的maven失敗的問題
- 2022-01-16 npm run dev 報錯:missing script:dev
- 2022-06-02 ubuntu安裝jupyter并設置遠程訪問的實現_python
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支