跳表(skiplist)
跳表由多層鏈表組成徙鱼,通過(guò)先比較上一層的大小宅楞,就可以很快找到該值在下一層的區(qū)間范圍针姿。時(shí)間復(fù)雜度為log(n).
Redis的zset,有序集合厌衙,是字典(dict)+ 跳表(skiplist)來(lái)實(shí)現(xiàn)的距淫。
數(shù)據(jù)只有同樣一份,字典中與跳表中都是存放的指針婶希。
壓縮列表
壓縮列表ziplist本質(zhì)上就是一個(gè)字節(jié)數(shù)組榕暇,是Redis為了節(jié)約內(nèi)存而設(shè)計(jì)的一種線(xiàn)性數(shù)據(jù)結(jié)構(gòu),可以包含多個(gè)元素喻杈,每個(gè)元素可以是一個(gè)字節(jié)數(shù)組或一個(gè)整數(shù)彤枢。使用壓縮算法,將數(shù)據(jù)進(jìn)行壓縮后筒饰,節(jié)省空間缴啡。
當(dāng)元素長(zhǎng)度較小時(shí),采用ziplist可以有效節(jié)省存儲(chǔ)空間瓷们,但ziplist的存儲(chǔ)空間是連續(xù)的业栅,當(dāng)元素個(gè)數(shù)比較多時(shí)秒咐,修改元素時(shí),必須重新分配存儲(chǔ)空間碘裕,這無(wú)疑會(huì)影響Redis的執(zhí)行效率携取,故而采用一般的雙向鏈表。
quicklist
quicklist是Redis底層最重要的數(shù)據(jù)結(jié)構(gòu)之一帮孔,它是Redis對(duì)外提供的6種基本數(shù)據(jù)結(jié)構(gòu)中List的底層實(shí)現(xiàn)雷滋。
quicklist實(shí)際上是ziplist與linkedList的混合,它將linkedList按段切分文兢,每一個(gè)段使用ziplist來(lái)存儲(chǔ)惊豺。多個(gè)ziplist使用雙向指針串聯(lián)起來(lái)