Redis Redis資料型別底層結構

2022-06-18 23:12:11 字數 2923 閱讀 2904

參考:《redis設計與實現》

redis伺服器的16個庫由redisserver結構體來儲存:

struct redisserver
redis客戶端,通過修改指向的redis伺服器的db指標,來切換資料庫;

redis中的乙個庫下所有k-v全都儲存在乙個字典內部:

乙個庫乙個鍵空間:

redis五種資料結構底層都是乙個c語言下的redisobject結構體:

typedef struct redisobjectrobj
redis中建立乙個key-value,至少會建立兩個redisobject:

鍵物件:一定是乙個redis_string型別;

值物件;

ptr指標:指向具體的資料;

refcount:引用計數;

用於記憶體**;

redis的字串底層使用sds(動態字串),而不是c語言的字串;

// sds的定義

為什麼不使用c的字串?

c字串sds獲取字串長度複雜度:o(n)

獲取字串長度複雜度:o(1)

不安全,可能緩衝區溢位

安全,不會溢位,不會洩露

修改字串,必須執行n次記憶體的重新分配

修改字串,除非是全部改需要n次記憶體分配

底層雙向鍊錶

鍊錶特點:

集合物件,有兩種編碼:intsethashtable

當集合物件,可以同時滿足下面兩條,則使用intset編碼:

否則:使用hashtable編碼;

兩種編碼的儲存方式:

是一種有序資料結構,通過每個節點中維持多個指向其他節點指標,達到快速訪問;

複雜度:增刪改查o(logn),最壞o(n)

zset插入節點,跳躍表的結構:

(1)每插入乙個節點,隨機為當前節點設定乙個層數;

結構原始碼:

// zset結構(跳躍表外觀)

typedef struct zskiplist

// 跳躍表的結構

typedef struct skiplisnode level;

// 後退指標

struct zskiplistnode *backward;

// 分值

double score;

// 成員物件

robj *obj;

}

按照上面兩個結構,形成的總體為:

redisobject中的ptr指標,指向的就是雜湊物件:

typedef struct dict
雜湊表:

typedef struct dictht
雜湊節點物件:

typedef struct dictentry v;

// next指標

1、為ht[1]分配空間,rehashidx置為0,表示正在rehash,並以此記錄索引;

2、採用漸進式rehash,不是rehash開始就一次性的把ht[0]都移動到ht[1];

而是:保持rehash的狀態,之後每次對此hash表的元素進行新增、刪除、查詢、更新時,除了執行相應的操作外,將rehashidx索引處的key-value,移動到ht[1]中;

3、隨著對雜湊表的操作,終會在某一次操作的時候,rehash完成;把h[1]整個放回ht[0],清空ht[1];

4、漸進式rehash:避免了集中rehash的計算量;

缺點:查詢的時候,可能要找的鍵已經rehash到ht[1]中去了,所以,每次查詢,兩個ht[0]、ht[1]都要進行查詢;

Redis Redis的資料型別

儲存string字串,使用get,set命令,乙個鍵最大儲存512m 儲存hash雜湊,使用hmset和hgetall命令,引數 鍵,值 例如 hmset user 1 username taoshihan password taoshihan hgetall user 1 儲存list列表,可以重...

Redis Redis的資料型別

string 是 redis 最基本的型別,可以理解成與 memcached一模一樣的型別,乙個 key 對應乙個 value。value 不僅是 string,也可以是數字。string 型別是二進位制安全的,意思是 redis 的 string 型別可以包含任何資料,比如 jpg 或者序列化的物...

Redis Redis 資料型別及應用場景

目錄 一 redis 特點 二 設計 redis key 三 string資料型別的應用場景 四 hash 資料型別的應用場景 五 list 資料型別的應用場景 六 set 資料型別的應用場景 七 sorted set 資料型別的應用場景 通常我們都把資料存到關係型資料庫中,但為了提公升應用的效能,...