五大結構實現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命名作為生產者 使...