Redis 資料結構

2021-09-03 02:38:16 字數 2035 閱讀 7643

五大結構實現string,hash, list,set,sortedset

大:數量多或單個value長。小:數量少且單個value短

redisobject(type,encoding,ptr指標,refcount(為0**,可共享)lru(最後訪問時間,用於超過maxmemory記憶體**) )如set msg hello 兩個redisobject

各型別編碼:

string(int,raw,embstr)

int: 可用long表示的整數,ptr指標轉為整數值

raw:大於39位元組字串,使用sds

embstr:小於等於39 優勢:一次記憶體分配和釋放(raw分別redisobject和sds分配,兩次),連續記憶體(redisobject和sds放在一起),embstr唯讀,修改轉為raw

list(小ziplist,大linkedlist)

hash(小ziplist,大字典)ziplist(key,value緊靠,兩個entry)

set(intset存放少量整數,字典value全為null)

sorted set(小ziplist,大skiplist)ziplist(key,score緊靠,兩個entry,由小到大,表頭score最小)

skiplist(score由小到大)

redis用c字串作字面量,不修改

sds(簡單動態字串),方便修改,free(2) ,len(5) char ,末尾\0 不計數

優勢:快速獲取長度(無需遍歷)

不會緩衝區溢位(先檢查,可能會動態擴充套件,預分配一定空間避免反覆擴充套件,縮減後不立即釋放空間,避免以後擴容需重分配)

二進位制安全(不以\0判定結束,而以len判定,這樣內容中也可存\0,可存二進位制資料)

鍊錶:list(維護表頭表尾,表長)listnode(next,prev,value指標(多型,隨便你value是啥))

字典:用於實現資料庫和hash,dict(含兩個dictht ,乙個使用,乙個rehash才用)

dictht(size,used,指向dictentry陣列指標)

dictentry(key指標(一般指向sds),value可為指標,可為int,next基於鏈位址解決衝突,晚進來的加在前面o(1))

rehash漸進式,rehash過程中也可crud(當然新增直接入新hashtable,其餘在兩個hashtable上進行)太大或太小(loadfactor=used/size)

skiplist:實現sortedset 查詢平均 o(log n) 最壞 o(n)

zskiplist(header,tail,level(除首節點最大層數),length(除首節點節點個數))

typedef struct zskiplistnode level;

}層數1到32之間隨機值,分數由小到大排列,同分數則按字典序排序

intset:用於只含整數且數量較少的集合

intset(encoding(16,32,64位),length,陣列(從小到大))

公升級:比如16位只能放-32768到32767,突然放入61000,那麼公升級,陣列每個位置公升為4位元組

不支援降級

ziplist(壓縮列表) 實現小list,小hash,節約記憶體

zlbytes 總位元組數

zltail 最後乙個entry離ziplist首部的偏移

zllen entry數目

zlend 標記末端

前一entry長度:用於反向遍歷,先zltail找最後entry,然後不斷向前

encoding:確定content型別(位元組陣列還是整數),長度(陣列多長,16位還是32位…整數)

新加或刪除entry可能連鎖更新,概率低。

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命名作為生產者 使...