Redis資料結構分析

2021-07-03 13:00:10 字數 2122 閱讀 2781

redis有 記憶體資料庫的讚譽,其支援一下幾種資料結構:

1. string

2. hashes

3. list

4. set

本文從源**角度來分析各種資料結構在 redis 內部是如何儲存和讀取的。

在介紹各種資料結構之前,首先來介紹下 redisobject 這個 struct , string , hash , list 和 set 在 redis 內部都是以 redisobject 來儲存的

c** 收藏**

/* a redis object, that is a type able to hold a string / list / set */

/* the actual redis object */

type:string, hash,list,set,sorted set;

storage: 這個引數只是在vm 開啟後才能用到,當vm 有很大的效能問題,基本不建議開啟;

encoding: 編碼方式: raw/int/ht/zmap/linkedlist/ziplist/intset ;

lru :lru 期限,redis 預設的lru 時間是1.5 年,所有基本不需要考慮key 被lru 掉的問題

refcount: 被引用的次數,因為redis 有shareobject 的概念,目前只支援共享stringobject 。redis 的共享物件有兩大模擬:第一類:redis server 的各種操作需要經常用到的各類物件,如:redis command 的分隔符 「\r\n」, 用於redis command 的reply 的」+ok\r\n」 或者」-err\r\n」 等物件,因為在redis 的各種操作這類物件要被頻繁使用,所以就在啟動 redis 的時候建立好,然後共用這些物件,減少時間成本和空間成本;第二,類的共享物件就是對應於數字的stringobject ,如:set 「olylakers1」 1234; set 「olylakes2」 1234; 在redis 內部,」olylakers1」 和」olylakers2」 這兩個key 都指向由數字1234 轉化的stringobject 。這 樣在海量資料和特定儲存內容下,可以節省大量的記憶體空間。可用通過redis_shared_integers 這個引數來指定redis 啟動的時候建立多 少個第二類共享物件,預設的引數是10000 ,即建立的strongobject 個取值範圍是0-9999 之間。

ptr :物件資料;

redisobjects 都是存放在redisdb 裡面的,redis 預設的是建立16 個db :

c** 收藏**

typedef struct redisdb redisdb;

redisdb 維護了各種dict ,所以說redis 內部基本的資料儲存結構就是乙個dict ,dict 就是乙個字典的資料結構,比較特殊的就是每個dict 含有兩個table ,即兩個dictht ,這是為了實現增量rehashe 準備的,當redis 的dict 在進行rehashe 的時候,新的資料插將被新增到dictht ht[1] 當中,反之則新增到ht[0] 中
c** 收藏**

typedef struct dict dict;

typedef struct dictht dictht;

redis 在響應各種命令的時候,把接收到的命令引數(key 和value 等)都轉化成type= redis_string 的redisobject ,最終執行命令將key 和value 儲存到redisdb 的dict 的時候,儲存的形式和內容是不相同的:在dict 裡面,key 儲存的是redisobject 裡面的prt 所指向的資料,而value 儲存的則是和命令對應的redisobject ,如執行list 的命令lpush listname content ,redisdb 裡面,存放的一條記錄key 為內容listname 的字串,而value (此value 不是命令對應的value )儲存的則是乙個redisobject (type= redis_encoding_ziplist , prt=ziplist ),然後把content 對應的內容add 到ziplist 上。

最後通過一張圖來展示redis內部db的實現和其支援的各種data types在redis db內的儲存方式

redis db & data types

Redis資料結構

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

Redis 資料結構

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

redis 資料結構

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