查ICP網(wǎng):全新的綜合網(wǎng)站備案信息查詢網(wǎng)
Copyright ? 2008-2028 www.mshuangcha.com [ 查icp] All Rights Reserved.
redis數(shù)據(jù)結(jié)構(gòu)的底層實(shí)現(xiàn)是怎樣的?
Redis有五種基本數(shù)據(jù)結(jié)構(gòu):字符串、hash、set、zset、list。下面解釋下載Redis 3.0.6版本中底層是怎樣實(shí)現(xiàn)他們的。
總結(jié)一下
(1)每種數(shù)據(jù)結(jié)構(gòu)都有自己底層的內(nèi)部編碼實(shí)現(xiàn),而且是多種實(shí)現(xiàn),這樣Redis會(huì)在合適的場(chǎng)景選擇合適的內(nèi)部編碼。
(2)可以看到每種數(shù)據(jù)結(jié)構(gòu)都有兩種以上的內(nèi)部編碼實(shí)現(xiàn),例如string數(shù)據(jù)結(jié)構(gòu)就包含了raw、int和embstr三種內(nèi)部編碼。
(3)同時(shí),有些內(nèi)部編碼可以作為多種外部數(shù)據(jù)結(jié)構(gòu)的內(nèi)部實(shí)現(xiàn),例如ziplist就是hash、list和zset共有的內(nèi)部編碼。
動(dòng)態(tài)字符串SDS
SDS是“simple dynamic string”的縮寫。Redis中所有場(chǎng)景出現(xiàn)的字符串,基本都是有SDS來實(shí)現(xiàn)的:
所有非數(shù)字的key, 如:set msg “hello” 中的key msg
字符串?dāng)?shù)據(jù)類型的值,如:set msg “hello” 中的value “hello”
非字符串?dāng)?shù)據(jù)類型中的“字符串值”,如:rpush fruits “apple” “banana"中的"apple” “banana”
SDS長這樣:
free:還剩多少空間
len:字符串長度
buf:存放的字符數(shù)組
空間預(yù)分配
為減少修改字符串代理的內(nèi)存重分配次數(shù),SDS采用了“一次管夠“的策略:
若修改之后SDS長度 < 1MB,則多分配現(xiàn)有l(wèi)en長度的空間
若修改之后SDS長度 >= 1MB ,則擴(kuò)充除了滿足修改之后的長度外,額外多1MB空間。
惰性空間釋放
為避免縮短字符串時(shí)候的內(nèi)存重分配操作,SDS在數(shù)據(jù)減少時(shí),并不立刻釋放空間。
int
就是redis中存放的各種數(shù)字,包括故意加“”的
set game “111”
雙向鏈表
雙向鏈表如lpush, rpush, lpop, rpop
長這樣:
分兩部分:
“統(tǒng)籌部分”:橘黃色
head:指向具體雙向鏈表的頭
tail:指向具體雙向鏈表的尾
len:雙向鏈表的長度
“具體實(shí)施方”:藍(lán)色
有前驅(qū)pre和后繼next
雙向鏈表由 list 和 listNode 兩個(gè)數(shù)據(jù)結(jié)構(gòu)構(gòu)成。