redis

redis數(shù)據(jù)庫泳桦,完全基于內存景用,且其內部數(shù)據(jù)類型豐富盗迟,性能也非常出色
redis中的集合插入分zet和set兩種坤邪,zset是有序的,而set是無序的罚缕,由于redis中的集合都是以hashcode的形式實現(xiàn)的艇纺,所以他添加,刪除邮弹,查找的時間復雜度和空間復雜度都是o(1)黔衡,集合中允許插入的最大數(shù)據(jù)量為(2^32-1)的數(shù)據(jù)量, Redis 有序集合和集合一樣也是 string 類型元素的集合,且不允許重復的成員腌乡。不同的是每個元素都會關聯(lián)一個 double 類型的分數(shù)盟劫。redis 正是通過分數(shù)來為集合中的成員進行從小到大的排序。有序集合的成員是唯一的,但分數(shù)(score)卻可以重復与纽。集合中最大的成員數(shù)為(2^32 - 1)侣签,而有序集合的添加和刪除塘装,會基于插入項的大小進行判定,如果是大于64字節(jié)硝岗,就同時使用了hash和skiplist兩種設計實現(xiàn)氢哮,這樣會大大優(yōu)化查找的性能,添加和刪除都需要修改skiplist型檀,所以復雜度為O(log(n)),而如果僅僅是查找元素的話可以直接使用hash听盖,其復雜度為O(1) 胀溺,其他的range操作復雜度一般為O(log(n)),如果是小于64字節(jié)的且元素數(shù)量小于128個的(可通過redis的配置項(zset-max-ziplist-entries 和 zset-max-ziplist-value )進行修改)皆看,則使用了ziplist編碼仓坞,否則會自動使用skiplist編碼

ziplist:

1627354748(1).png

ziplist 編碼的 Zset 使用緊挨在一起的壓縮列表節(jié)點來保存。ziplist 內的集合元素按 score 從小到大排序腰吟,其實質是一個雙向鏈表无埃。雖然元素是按 score 有序排序的, 但對 ziplist 的節(jié)點指針只能線性地移動毛雇,所以在 REDIS_ENCODING_ZIPLIST 編碼的 Zset 中嫉称, 查找某個給定元素的復雜度O(N)

skiplist:

skiplist 編碼的 Zset 底層為一個被稱為 zset 的結構體答姥,這個結構體中包含一個字典和一個跳躍表辖众。
跳表(skipList)是一種隨機化的數(shù)據(jù)結構冗荸,基于并聯(lián)的鏈表刷钢,實現(xiàn)簡單泽铛,插入直秆、刪除邑狸、查找的復雜度均為O(logN)诡必。簡單說來跳表也是鏈表的一種蒿赢,只不過它在鏈表的基礎上增加了跳躍功能润樱,正是這個跳躍的功能,使得在查找元素時羡棵,跳表能夠提供O(logN)的時間復雜度
跳表除了第一層鏈表中的具體節(jié)點之外壹若,還存在若干層稀疏的鏈表,這些鏈表里面的指針故意跳過了一些節(jié)點(而且越高層的鏈表跳過的節(jié)點越多)晾腔。這就使得我們在查找數(shù)據(jù)的時候能夠先在高層的鏈表中進行查找舌稀,然后逐層降低,最終降到第1層鏈表來精確地確定數(shù)據(jù)位置灼擂,這樣提升了查詢的效率

  1. 跳表中的每個節(jié)點都會有若干個指針壁查,每個節(jié)點肯定都有第1層指針(每個節(jié)點都在第1層鏈表里)
  2. 如果一個節(jié)點有第i層(i>=1)指針(即節(jié)點已經(jīng)在第1層到第i層鏈表中),那么它有第(i+1)層指針的概率為p
  3. 節(jié)點最大的層數(shù)不允許超過一個最大值剔应,記為MaxLevel
    在redis中這兩個值是允許設置的睡腿,默認概率為1/4语御,節(jié)點層數(shù)最大值為32
SKIPLIST和平衡樹還有hashcode的對比:
  1. skiplist和各種平衡樹(如AVL、紅黑樹等)的元素是有序排列的席怪,而哈希表不是有序的应闯。因此,在哈希表上只能做單個key的查找挂捻,不適宜做范圍查找碉纺。所謂范圍查找,指的是查找那些大小在指定的兩個值之間的所有節(jié)點
  2. skiplist在做范圍查找的時候刻撒,平衡樹比skiplist操作要復雜骨田。在平衡樹上,我們找到指定范圍的小值之后声怔,還需要以中序遍歷的順序繼續(xù)尋找其它不超過大值的節(jié)點态贤。如果不對平衡樹進行一定的改造,這里的中序遍歷并不容易實現(xiàn)醋火。而在skiplist上進行范圍查找就非常簡單悠汽,只需要在找到小值之后,對第1層鏈表進行若干步的遍歷就可以實現(xiàn)芥驳,從算法邏輯上skiplist比平衡樹要簡單得多
  3. 平衡樹的插入和刪除操作可能引發(fā)子樹的調整柿冲,邏輯復雜,而skiplist的插入和刪除只需要修改相鄰節(jié)點的指針晚树,操作簡單又快速
  4. 從內存占用上來說姻采,skiplist比平衡樹更靈活一些。一般來說爵憎,平衡樹每個節(jié)點包含2個指針(分別指向左右子樹)慨亲,而skiplist每個節(jié)點包含的指針數(shù)目平均為1/(1-p),具體取決于參數(shù)p的大小宝鼓。如果像Redis里的實現(xiàn)一樣刑棵,取p=1/4,那么平均每個節(jié)點包含1.33個指針愚铡,比平衡樹更有優(yōu)勢
  5. 查找單個key蛉签,skiplist和平衡樹的時間復雜度都為O(log n),大體相當沥寥;而哈希表在保持較低的哈希值沖突概率的前提下碍舍,查找時間復雜度接近O(1),性能更高一些邑雅。所以我們平常使用的各種Map或dictionary結構片橡,大都是基于哈希表實現(xiàn)的

zsetOps.removeRangeByScore
移除有序集 key 中,所有 score 值介于 min 和 max 之間(包括等于 min 或 max )的成員淮野。 min 和 max 可以是 -inf 和 +inf 捧书,這樣一來吹泡,你就可以在不知道有序集的最低和最高 score 值的情況下,使用 ZRANGEBYSCORE 這類命令经瓷。 默認情況下爆哑,區(qū)間的取值使用閉區(qū)間 (小于等于或大于等于),你也可以通過給參數(shù)前增加 "(" 符號來使用可選的開區(qū)間 (小于或大于)舆吮。例如"(5"代表不包括5

zsetOps.intersectAndStore(key1,key2,key3)
取key1和key3的交集放入key2中

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末揭朝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子色冀,更是在濱河造成了極大的恐慌萝勤,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呐伞,死亡現(xiàn)場離奇詭異,居然都是意外死亡慎式,警方通過查閱死者的電腦和手機伶氢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘪吏,“玉大人癣防,你說我怎么就攤上這事≌泼撸” “怎么了蕾盯?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蓝丙。 經(jīng)常有香客問我级遭,道長,這世上最難降的妖魔是什么渺尘? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任挫鸽,我火速辦了婚禮,結果婚禮上鸥跟,老公的妹妹穿的比我還像新娘丢郊。我一直安慰自己,他們只是感情好医咨,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布枫匾。 她就那樣靜靜地躺著,像睡著了一般拟淮。 火紅的嫁衣襯著肌膚如雪干茉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天惩歉,我揣著相機與錄音等脂,去河邊找鬼俏蛮。 笑死,一個胖子當著我的面吹牛上遥,可吹牛的內容都是我干的搏屑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼粉楚,長吁一口氣:“原來是場噩夢啊……” “哼辣恋!你這毒婦竟也來了?” 一聲冷哼從身側響起模软,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤伟骨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后燃异,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體携狭,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年回俐,在試婚紗的時候發(fā)現(xiàn)自己被綠了逛腿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡仅颇,死狀恐怖单默,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情忘瓦,我是刑警寧澤搁廓,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站耕皮,受9級特大地震影響境蜕,放射性物質發(fā)生泄漏。R本人自食惡果不足惜明场,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一汽摹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苦锨,春花似錦逼泣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秃励,卻和暖如春氏仗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工皆尔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呐舔,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓慷蠕,卻偏偏與公主長得像珊拼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子流炕,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容