1. 程式人生 > >redis 型別底層儲存結構

redis 型別底層儲存結構

1、資料結構 

Redis 內部使用一個 redisObject 物件來表示所有的 key 和 value。

a、type :代表一個 value 物件具體是何種資料型別。

b、encoding :是不同資料型別在 redis 內部的儲存方式,比如:type=string 代表 value 儲存的是一個普通字串,那麼對應的 encoding 可以是 raw 或者是 int,如果是 int 則代表實際 redis 內部是按數值型類儲存和表示這個字串的,當然前提是這個字串本身可以用數值表示,比如:"123" "456"這樣的字串。

c、vm 欄位:只有打開了 Redis 的虛擬記憶體功能,此欄位才會真正的分配記憶體,該功能預設是關閉狀態的。 Redis 使用 redisObject 來表示所有的 key/value 資料是比較浪費記憶體的,當然這些記憶體管理成本的付出主要也是為了給 Redis 不同資料型別提供一個統一的管理介面,實際作者也提供了多種方法幫助我們儘量節省記憶體使用

2、過期刪除

過期資料的清除從來不容易,為每一條key設定一個timer,到點立刻刪除的消耗太大,每秒遍歷所有資料消耗也大,Redis使用了一種相對務實的做法: 當client主動訪問key會先對key進行超時判斷,過時的key會立刻刪除。 如果clien永遠都不再get那條key呢? 它會在Master的後臺,每秒10次的執行如下操作: 隨機選取100個key校驗是否過期,如果有25個以上的key過期了,立刻額外隨機選取下100個key(不計算在10次之內)。可見,如果過期的key不多,它最多每秒回收200條左右,如果有超過25%的key過期了,它就會做得更多,但只要key不被主動get,它佔用的記憶體什麼時候最終被清理掉只有天知道 .

3、String

a、可以是String,也可是是任意的byte[]型別的陣列,如圖片等。

b、對String代表的數字進行增減操作

c、BitMap

4、Hash

Redis 的 Hash 實際是內部儲存的 Value 為一個 HashMap,並提供了直接存取這個 Map 成員的介面。Hash將物件的各個屬性存入Map裡,可以只讀取/更新物件的某些屬性。另外不同的模組可以只更新自己關心的屬性而不會互相併發覆蓋衝突。

Redis Hash 對應 Value 內部實際就是一個 HashMap,實際這裡會有2種不同實現,** 這個 Hash 的成員比較少時 Redis 為了節省記憶體會採用類似一維陣列的方式來緊湊儲存,而不會採用真正的 HashMap 結構,對應的 value redisObject 的 encoding 為 zipmap,當成員數量增大時會自動轉成真正的 HashMap,此時 encoding 為 ht

5、set

set 的內部實現是一個 value 永遠為 null 的 HashMap,實際就是通過計算 hash 的方式來快速排重的,這也是 set 能提供判斷一個成員是否在集合內的原因。

6、sortedset

Sorted Set的實現是HashMap(element->score, 用於實現ZScore及判斷element是否在集合內),和SkipList(score->element,按score排序)的混合體。SkipList有點像平衡二叉樹那樣,不同範圍的score被分成一層一層,每層是一個按score排序的連結串列。

7、list