參考:《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次記憶體分配
底層雙向鍊錶
鍊錶特點:
集合物件,有兩種編碼:intset
、hashtable
;
當集合物件,可以同時滿足下面兩條,則使用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 資料型別的應用場景 通常我們都把資料存到關係型資料庫中,但為了提公升應用的效能,...