Redis 資料結構

2021-07-13 20:01:02 字數 2098 閱讀 7325

最近接觸到了redis的使用,借這個機會深入的了解一下redis的實現和設計原理。下面先介紹一下redis底層所用到的資料結構。redis的實現幾乎都是基於下面的幾個資料結構之上的。

struct sdshdr ;

struct listnode ;

struct list ;

struct dictentry v;

struct dictentry* next;

};

struct dictht;

字典的資料結構:

struct dict ;

struct dicttype ;

隨著操作不短執行,雜湊表儲存的鍵值對會主鍵增多或減少,為了讓雜湊表的敷在引資維持在乙個合理的範圍之內,當雜湊表儲存的鍵值對數量太多或太少,程式會對雜湊表大小進行相應的擴充套件或收縮。步驟如下:

當滿足下面任意個條件是,程式會自動對雜湊表執行擴充套件操作

雜湊因子計算公式:

load_factor = ht[0].used / ht[0].size

為了保證資料一致性,在漸進式rehash過程中所有操作會對兩個雜湊表同時進行操作。

zskiplist結構:

如上圖,zskiplist結構右方是四個zskiplistnode結構,該結構包含一下屬性:

表頭幾點也包含score backward 只是不被用到所以在圖中省了。

typedef struct zskiplistnode level;

struct zskiplistnode *backward;

double score;

robj * obj;

}zskiplistnode;

level(層) ,一般來說曾德數量月耳朵,訪問其他節點速度就越快,每次建立乙個新跳躍表節點,程式都根據冪次定律(越大的書出現的概率越小)隨機生成乙個介於1到32的值作為level陣列大小,這個大小就是層的高度。

typedef struct zskiplist zskiplist;

是集合鍵的底層實現,當乙個集合只包含整數值元素,並且這個集合的元素數量不多時,redis就會使用正數集合作為集合鍵的底層實現。其資料結構如下:

typedef struct intset intset;

集合公升級, 當講乙個新元素新增到整數集合中,並且新元素型別比整數集合現有所有型別都要長時,整數集合需要公升級。然後才將新元素新增到整數集合中。但是整數集合不支援型別降級操作。

Redis資料結構

字典 dict 是redis裡最核心的資料結構,正如其全稱remote dictionary service所說,redis其實就是乙個字典服務,字典以key value的形式呈現給使用者,key是簡單的字串,而value可以是各種資料結構,比如字串 string 鍊錶 list 集合 set 排序...

redis 資料結構

今天學習了redis的列表型別 lpush ltrim lrange lpush mylist content ltrim 0,99 lrange 0,1 lrange 兩個引數 分別代表第乙個元素和最後乙個元素 redis的列表型別,可以用來做訊息佇列 使用乙個程序 用lpush命名作為生產者 使...

Redis資料結構

redis有哪些資料結構?基本的是有5種 字串string 列表list 集合set 字典hash 有序集合sortedset。如果是redis中高階使用者,還需要加上下面幾種資料結構hyperloglog geo pub sub以及redis module,像bloomfilter,redisse...