一坚冀、Redis集合數(shù)據(jù)結(jié)構(gòu)(set)
Redis 的集合不是一個(gè)線性結(jié)構(gòu),而是一個(gè)哈希表結(jié)構(gòu)瀑焦,它的內(nèi)部會根據(jù) hash 分子來存儲和查找數(shù)據(jù)翎碑,理論上一個(gè)集合可以存儲 2 的 32 次方減 1 個(gè)節(jié)點(diǎn)(大約 42 億)個(gè)元素突颊,因?yàn)椴捎霉1斫Y(jié)構(gòu)裆甩,所以對于 Redis 集合的插入冗锁、刪除和查找的復(fù)雜度都是 0(1),只是我們需要注意 3 點(diǎn)嗤栓。
- 對于集合而言冻河,它的每一個(gè)元素都是不能重復(fù)的,當(dāng)插入相同記錄的時(shí)候都會失敗
- 集合是無序的茉帅。
- 集合的每一個(gè)元素都是 String 數(shù)據(jù)結(jié)構(gòu)類型叨叙。
集合是無序的,并且支持并集堪澎、交集和差集的運(yùn)算
二摔敛、Redis有序集合(sorted set)
有序集合和集合類似,只是說它是有序的全封,和無序集合的主要區(qū)別在于每一個(gè)元素除了值之外马昙,它還會多一個(gè)分?jǐn)?shù)。分?jǐn)?shù)是一個(gè)浮點(diǎn)數(shù)刹悴,在 Java 中是使用雙精度表示的行楞,根據(jù)分?jǐn)?shù),Redis 就可以支持對分?jǐn)?shù)從小到大或者從大到小的排序土匀。
這里和無序集合一樣子房,對于每一個(gè)元素都是唯一的,但是對于不同元素而言就轧,它的分?jǐn)?shù)可以一樣证杭。元素也是 String 數(shù)據(jù)類型,也是一種基于 hash 的存儲結(jié)構(gòu)妒御。
集合是通過哈希表實(shí)現(xiàn)的解愤,所以添加、刪除乎莉、查找的復(fù)雜度都是 0(1)送讲。集合中最大的成員數(shù)為 2 的 32 次方減 1(40 多億個(gè)成員),有序集合的數(shù)據(jù)結(jié)構(gòu)如圖 1 所示惋啃。
有序集合是依賴 key 標(biāo)示它是屬于哪個(gè)集合哼鬓,依賴分?jǐn)?shù)進(jìn)行排序,所以值和分?jǐn)?shù)是必須的边灭,而實(shí)際上不僅可以對分?jǐn)?shù)進(jìn)行排序异希,在滿足一定的條件下,也可以對值進(jìn)行排序绒瘦。
三称簿、Redis HyperLogLog(基數(shù))
基數(shù)是一種算法扣癣。舉個(gè)例子,一本英文著作由數(shù)百萬個(gè)單詞組成予跌,你的內(nèi)存卻不足以存儲它們搏色,那么我們先分析一下業(yè)務(wù)。
英文單詞本身是有限的券册,在這本書的幾百萬個(gè)單詞中有許許多多重復(fù)單詞频轿,扣去重復(fù)的單詞,這本書中也就是幾千到一萬多個(gè)單詞而已烁焙,那么內(nèi)存就足夠存儲它們了航邢。
比如數(shù)字集合 {1,2,5,7,9,1,5,9} 的基數(shù)集合為 {1,2,5,7,9} 那么基數(shù)(不重復(fù)元素)就是 5個(gè),基數(shù)的作用是評估大約需要準(zhǔn)備多少個(gè)存儲單元去存儲數(shù)據(jù)骄蝇,但是基數(shù)的算法一般會存在一定的誤差(一般是可控的)膳殷。Redis 對基數(shù)數(shù)據(jù)結(jié)構(gòu)的支持是從版本 2.8.9 開始的。
基數(shù)并不是存儲元素九火,存儲元素消耗內(nèi)存空間比較大赚窃,而是給某一個(gè)有重復(fù)元素的數(shù)據(jù)集合(一般是很大的數(shù)據(jù)集合)評估需要的空間單元數(shù),所以它沒有辦法進(jìn)行存儲岔激,加上在工作中用得不多勒极,所以基數(shù)就介紹到這兒了。
四虑鼎、總結(jié)
通過前面的文章我們已經(jīng)了解了Redis的一些基礎(chǔ)內(nèi)容和六種數(shù)據(jù)結(jié)構(gòu)辱匿,日常工作中我們主要使用到的Redis高速的讀寫速度來優(yōu)化我們的應(yīng)用打開速度,利用到的數(shù)據(jù)結(jié)構(gòu)也是以字符串炫彩、哈希為主匾七。后面的文章我們將會講到一些Redis的高級用法,譬如Redis哨兵江兢、集群昨忆、持久化及一些緩存淘汰策略模式等等。愛學(xué)的你們要持續(xù)關(guān)注該Redis專題哦~~