成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis中五大數據結構的底層實現

運維 數據庫運維 Redis
下面讓我們來詳細介紹一下redis中五大數據結構的底層實現。讓我們一起來看看吧。

一、概述

Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,與Memcached類似,卻優于Memcached的一個高性能的key-value數據庫。下面讓我們來詳細介紹一下redis中五大數據結構的底層實現。

二、簡單動態字符串

1、概述

Redis是一個開源的使用ANSI C語言編寫的key-value 數據庫,我們可能會較為主觀的認為 Redis 中的字符串就是采用了C語言中的傳統字符串表示,但其實不然,Redis沒有直接使用C語言傳統的字符串表示,而是自己構建了一種名為簡單動態字符串(simple dynamic string SDS)的抽象類型,并將SDS用作Redis的默認字符串表示:redis>SET msg "hello world"

SDS 定義: 

  1. struct sdshdr{  
  2.      //記錄buf數組中已使用字節的數量  
  3.      //等于 SDS 保存字符串的長度  
  4.      int len;  
  5.      //記錄 buf 數組中未使用字節的數量  
  6.      int free;  
  7.      //字節數組,用于保存字符串  
  8.      char buf[];  

圖片來源:《Redis設計與實現》

我們看上面對于 SDS 數據類型的定義:

  •  len 保存了SDS保存字符串的長度
  •  buf[] 數組用來保存字符串的每個元素
  •  free j記錄了 buf 數組中未使用的字節數量  

2、與C語言相比較 

一般來說,SDS 除了保存數據庫中的字符串值以外,SDS 還可以作為緩沖區(buffer):包括 AOF 模塊中的AOF緩沖區以及客戶端狀態中的輸入緩沖區。后面在介紹Redis的持久化時會進行介紹。

三、鏈表

1、概述

鏈表提供了高效的節點重排能力,以及順序性的節點訪問方式,并且可以通過增刪節點來靈活地調整鏈表的長度。

鏈表在Redis 中的應用非常廣泛,比如列表鍵的底層實現之一就是鏈表。當一個列表鍵包含了數量較多的元素,又或者列表中包含的元素都是比較長的字符串時,Redis 就會使用鏈表作為列表鍵的底層實現。

每個鏈表節點使用一個listNode結構表示(adlist.h/listNode): 

  1. typedef  struct listNode{  
  2.        //前置節點  
  3.        struct listNode *prev;  
  4.        //后置節點  
  5.        struct listNode *next;  
  6.        //節點的值  
  7.        void *value;    
  8. }listNode 

鏈表的數據結構: 

  1. typedef struct list{  
  2.       //表頭節點  
  3.      listNode *head;  
  4.      //表尾節點  
  5.      listNode *tail;  
  6.      //鏈表所包含的節點數量  
  7.      unsigned long len;  
  8.      //節點值復制函數  
  9.      void (*free) (void *ptr);  
  10.      //節點值釋放函數  
  11.      void (*free) (void *ptr);  
  12.      //節點值對比函數  
  13.      int (*match) (void *ptr,void *key);  
  14. }list; 

組成結構圖

2、Redis鏈表特性

  •  雙端:鏈表具有前置節點和后置節點的引用,獲取這兩個節點時間復雜度都為O(1)。
  •  無環:表頭節點的 prev 指針和表尾節點的 next 指針都指向 NULL,對鏈表的訪問都是以 NULL 結束。 
  •  帶鏈表長度計數器:通過 len 屬性獲取鏈表長度的時間復雜度為 O(1)。
  •  多態:鏈表節點使用 void* 指針來保存節點值,可以保存各種不同類型的值。

四、字典

1、概述

字典又稱為符號表或者關聯數組、或映射(map),是一種用于保存鍵值對的抽象數據結構。字典中的每一個鍵 key 都是唯一的,通過 key 可以對值來進行查找或修改。C 語言中沒有內置這種數據結構的實現,所以字典依然是 Redis自己構建的。

哈希表結構定義: 

  1. typedef struct dictht{  
  2.      //哈希表數組  
  3.      dictEntry **table;  
  4.      //哈希表大小  
  5.      unsigned long size;  
  6.      //哈希表大小掩碼,用于計算索引值  
  7.      //總是等于 size-1  
  8.      unsigned long sizemask;  
  9.      //該哈希表已有節點的數量  
  10.      unsigned long used;  
  11. }dictht 

哈希表是由數組 table 組成,table 中每個元素都是指向 dict.h/dictEntry 結構,dictEntry 結構定義如下: 

  1. typedef struct dictEntry{  
  2.      //鍵  
  3.      void *key;  
  4.      //值  
  5.      union{  
  6.           void *val;  
  7.           uint64_tu64;  
  8.           int64_ts64;  
  9.      }v;  
  10.      //指向下一個哈希表節點,形成鏈表  
  11.      struct dictEntry *next; 
  12. }dictEntry 

key 用來保存鍵,val 屬性用來保存值,值可以是一個指針,也可以是uint64_t整數,也可以是int64_t整數。

注意這里還有一個指向下一個哈希表節點的指針,我們知道哈希表最大的問題是存在哈希沖突,如何解決哈希沖突,有開放地址法和鏈地址法。這里采用的便是鏈地址法,通過next這個指針可以將多個哈希值相同的鍵值對連接在一起,用來解決哈希沖突。

五、跳躍表

1、概述

跳躍表(skiplist)是一種有序數據結構,它通過在每個節點中維持多個指向其他節點的指針,從而達到快速訪問節點的目的。跳躍表是一種隨機化的數據,跳躍表以有序的方式在層次化的鏈表中保存元素,效率和平衡樹媲美 ——查找、刪除、添加等操作都可以在對數期望時間下完成,并且比起平衡樹來說,跳躍表的實現要簡單直觀得多。

Redis 只在兩個地方用到了跳躍表,一個是實現有序集合鍵,另外一個是在集群節點中用作內部數據結構。

Redis中跳躍表節點定義如下: 

  1. typedef struct zskiplistNode {  
  2.      //層  
  3.      struct zskiplistLevel{  
  4.            //前進指針  
  5.            struct zskiplistNode *forward;  
  6.            //跨度  
  7.            unsigned int span;  
  8.      }level[];  
  9.      //后退指針  
  10.      struct zskiplistNode *backward;  
  11.      //分值  
  12.      double score;  
  13.      //成員對象  
  14.      robj *obj;  
  15. } zskiplistNode 

多個跳躍表節點構成一個跳躍表: 

  1. typedef struct zskiplist{  
  2.      //表頭節點和表尾節點  
  3.      structz skiplistNode *header, *tail;  
  4.      //表中節點的數量  
  5.      unsigned long length;  
  6.      //表中層數最大的節點的層數  
  7.      int level;  
  8. }zskiplist; 
  •  header和tail指針分別指向跳躍表的表頭和表尾節點;
  •  length屬性記錄節點的數量;
  •  level屬性記錄層數最高的幾點的層數量;
  •  下圖分別展示了完整的跳躍表和單個節點的詳細結構圖:

2、特性

跳表具有如下性質:

  •  由很多層結構組成
  •  每一層都是一個有序的鏈表
  •  最底層(Level 1)的鏈表包含所有元素
  •  如果一個元素出現在 Level i 的鏈表中,則它在 Level i 之下的鏈表也都會出現。
  •  每個節點包含兩個指針,一個指向同一鏈表中的下一個元素,一個指向下面一層的元素。

六、整數集合

1、概述

《Redis 設計與實現》 中這樣定義整數集合:“整數集合是集合建的底層實現之一,當一個集合中只包含整數,且這個集合中的元素數量不多時,redis就會使用整數集合intset作為集合的底層實現。”

我們可以這樣理解整數集合,他其實就是一個特殊的集合,里面存儲的數據只能夠是整數,并且數據量不能過大。 

  1. typedef struct intset{  
  2.      //編碼方式  
  3.      uint32_t encoding;  
  4.      //集合包含的元素數量  
  5.      uint32_t length;  
  6.      //保存元素的數組  
  7.      int8_t contents[];  
  8. }intset; 

我們觀察一下一個完成的整數集合結構圖:   

  • encoding:用于定義整數集合的編碼方式
  • length:用于記錄整數集合中變量的數量
  • contents:用于保存元素的數組,雖然我們在數據結構圖中看到,intset將數組定義為int8_t,但實際上數組保存的元素類型取決于encoding

2、特性

  •  整數集合是集合建的底層實現之一
  •  整數集合的底層實現為數組,這個數組以有序,無重復的范式保存集合元素,在有需要時,程序會根據新添加的元素類型改變這個數組的類型
  •  升級操作為整數集合帶來了操作上的靈活性,并且盡可能地節約了內存2

    整數集合只支持升級操作,不支持降級操作

七、壓縮列表

1、概述

壓縮列表是列表鍵和哈希鍵的底層實現之一。當一個列表鍵只包含少量列表項,并且每個列表項要么就是小整數,要么就是長度比較短的字符串,那么Redis 就會使用壓縮列表來做列表鍵的底層實現。

一個壓縮列表的組成如下:  

  •  zlbytes:用于記錄整個壓縮列表占用的內存字節數
  •  zltail:記錄要列表尾節點距離壓縮列表的起始地址有多少字節
  •  zllen:記錄了壓縮列表包含的節點數量
  •  entryX:要說列表包含的各個節點
  •  zlend:用于標記壓縮列表的末端

2、特性

  •  壓縮列表是一種為了節約內存而開發的順序型數據結構
  •  壓縮列表被用作列表鍵和哈希鍵的底層實現之一
  •  壓縮列表可以包含多個節點,每個節點可以保存一個字節數組或者整數值
  •  添加新節點到壓縮列表,可能會引發連鎖更新操作。 

 

責任編輯:龐桂玉 來源: DBAplus社群
相關推薦

2023-10-18 15:17:24

Redis數據結構Java

2012-08-13 14:27:31

大數據

2017-01-15 10:56:57

大數據非結構化過期

2021-09-08 17:17:43

大數據智慧城市大數據應用

2019-06-21 15:20:05

Redis數據結構數據庫

2019-10-29 08:59:16

Redis底層數據

2015-10-20 09:42:36

醫療大數據應用

2020-11-04 07:34:02

Redis數據類型

2013-01-10 10:30:32

大數據預測Hadoop

2025-01-14 08:00:00

RedisList數據結構

2025-01-15 12:20:41

2022-03-14 09:46:10

Hadoop大數據

2019-06-12 22:51:57

Redis軟件開發

2012-02-15 09:29:58

大數據IT

2015-08-26 10:46:16

大數據

2019-05-27 23:21:47

大數據云遷移企業

2022-08-08 10:20:19

數據安全首席信息安全官

2019-09-27 08:53:47

Redis數據C語言

2019-04-17 15:35:37

Redis數據庫數據結構

2016-11-08 13:07:43

大數據教育行業
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线中文字幕第一页 | 一级片在线观看 | 欧美a免费 | 成年人视频免费在线观看 | 在线欧美视频 | 久久久久免费观看 | 国产欧美一区二区三区国产幕精品 | 欧美成人免费在线视频 | 久久高潮 | 91精品国产一区二区三区香蕉 | 伊人在线| 欧美日韩免费 | 啪啪毛片 | 国产视频h| 四虎影院久久 | 国产精品久久久久久久久久免费看 | 亚洲激情自拍偷拍 | a级黄色片视频 | 日本不卡一区二区三区 | 久久99精品久久久久久青青日本 | 99精品欧美一区二区三区综合在线 | 久久久婷婷 | 欧美日一区 | 久草精品视频 | 日韩在线中文字幕 | 欧美激情视频一区二区三区在线播放 | 精品视频一区二区三区在线观看 | 亚洲精品久久久久久久久久久 | 日韩精品a在线观看图片 | 国内精品久久久久 | 久久久美女 | 国产黄色大片 | 日韩在线免费视频 | 久久久99国产精品免费 | 久久精品中文 | 人人干人人看 | 日本欧美国产在线观看 | 99精品亚洲国产精品久久不卡 | 欧美一区二区在线 | 91精品在线播放 | 免费观看色 |