Redis2 8和4 0的基本資料結構

2021-08-09 07:37:29 字數 2477 閱讀 8749

redis資料結構,網上資料也很多,redis設計與實現書上講的也很明白,具體的也可以參考部落格專欄,這裡只對redis2.8和4.0版本做個簡單的對比:

(sds,list,dictht,skiplist,intset,ziplist,quicklist)

簡單動態字串(sds),在redis需要的不止是字串字面量,而是乙個可以被修改的字串值時,redis會使用sds來表示,這裡可以先看其定義,在2.8和4.0版本中定義是不一樣的,4.0中的版本中有sdshdr5、sdshdr8、sdshdr16、sdshdr32、sdshdr64五種型別,可以在sds.h檔案中找到。

redis2.8

struct sdshdr;

redis4.0

struct __attribute__ ((__packed__)) sdshdr64 ;

鍊錶(list )是列表鍵的底層儲存結構之一,定義在adlist.h檔案中,鍊錶型別在2.8中用於list的實現,在4.0中list則全部使用quicklist實現。

redis2.8和4.0中一致

typedef

struct listnode listnode;

typedef

struct

list list;

字典(dictht)是雜湊表的底層實現,乙個雜湊表裡面有兩個雜湊表節點,乙個用於儲存,乙個用於遷移資料,同樣2.8和4.0的結構一致,可在dict.h檔案中找到。

typedef

struct dictentry v;

struct dictentry *next;//下乙個雜湊表節點,鍊錶形式

} dictentry;

/* this is our hash table structure. every dictionary has two of this as we

* implement incremental rehashing, for the old to the new table. */

typedef

struct dictht dictht;

跳躍表(skiplist),跳躍錶可在redis.h檔案中找到,其中zkiplistnode和zskiplist為其定義,2.8和4.0定義一致。

typedef

struct zskiplistnode level;

} zskiplistnode;

typedef

struct zskiplist zskiplist;

typedef

struct zset zset;

整數集合(intset)是集合鍵的底層實現之一,當乙個集合只包含整數元素,並且這個集合元素數量不多時,redis就會使用整數集合作為集合鍵的底層實現,其中2.8和4.0定義一致。

typedef struct intset  intset;
壓縮列表(ziplist)是列表鍵和雜湊鍵的實現之一,在2.8中當乙個列表鍵只包含少量列表時會使用ziplist,在4.0中列表鍵則是quicklist的實現,其中節點結構可在ziplist.c檔案中找到,2.8和4.0的定義一致。

typedef

struct zlentry zlentry;

(quicklist)是乙個有ziplist組成的雙向鍊錶,從3.2版本新增的,可以在quicklist.h中找到其定義。

typedef

struct quicklistnode quicklistnode;

typedef

struct quicklist quicklist;

不同型別和編碼物件對應關係,以及轉換條件

- string:int(使用整數值實現的字串物件,如果乙個字串物件儲存的是整數值,並且可以用long表示),embstr(使用embstr編碼的簡單動態字串實現的字串物件,字串物件儲存的是字串值,並且字串值長度小於39位元組,),raw(使用簡單動態字串實現的字串物件,字串物件儲存的是字串值,並且字串值長度大於39位元組)

- list:ziplist,linkedlist,當列表物件儲存的所有字串長度都小於64位元組,且儲存的元素數量小於512個時用ziplist。

- hash:ziplist,hashtable,雜湊物件儲存的鍵值對的鍵和值字串長度都小於64位元組,且儲存的鍵值對數量小於512使用ziplist。

- set:intset,hashtable,集合物件儲存的元素都是整數值,且集合物件儲存的元素數量不超過512個時用intset。

- zset:ziplist,skiplist和hashtable,有血集合儲存的元素小於128個,且有序集合儲存的所有元素成員的長度都小於64位元組時使用ziplist。注意在因為類似zrank和zrange命令用skiplist,zscore則從hashtable獲取。

Redis 28 底層資料結構字串

sds dynamic string char data abc 字元陣列,c語言字元陣列最後會加個 0,如果字串中包含了 0,資料會出問題 int len 使用len長度,每次修改都需要重新分配長度 int free 用空間換時間預先分配多一點空間,減少重新分配的次數 int 型別佔4個位元組,l...

redis基本資料型別

redis支援五種資料型別 string 字串 hash 雜湊 list 列表 set 集合 及zset sorted set 有序集合 string key value型 0.1 6379 set name haha ok127.0 0.1 6379 get name haha hash 是乙個鍵...

Redis基本資料及操作

set set name zhangsan ok get name zhangsan自增increase incr incr key1 integer 1 incr key1 integer 2自減decrease decr decr key1 integer 1檢視 keys keys 1 nam...