Redis數據類型之--集合、有序集合和HyperLogLog

一、Redis集合數據類型(set)

Redis 的集合不是一個線性結構,而是一個哈希表結構,它的內部會根據 hash 分子來存儲和查找數據,理論上一個集合可以存儲 2 的 32 次方減 1 個節點(大約 42 億)個元素,因爲採用哈希表結構,所以對於 Redis 集合的插入、刪除和查找的複雜度都是 0(1),只是我們需要注意 3 點。

  • 對於集合而言,它的每一個元素都是不能重複的,當插入相同記錄的時候都會失敗
  • 集合是無序的。
  • 集合的每一個元素都是 String 數據結構類型。

集合是無序的,並且支持並集、交集和差集的運算

二、Redis有序集合(sorted set)

有序集合和集合類似,只是說它是有序的,和無序集合的主要區別在於每一個元素除了值之外,它還會多一個分數。分數是一個浮點數,在 Java 中是使用雙精度表示的,根據分數,Redis 就可以支持對分數從小到大或者從大到小的排序。

這裏和無序集合一樣,對於每一個元素都是唯一的,但是對於不同元素而言,它的分數可以一樣。元素也是 String 數據類型,也是一種基於 hash 的存儲結構。

集合是通過哈希表實現的,所以添加、刪除、查找的複雜度都是 0(1)。集合中最大的成員數爲 2 的 32 次方減 1(40 多億個成員),有序集合的數據結構如圖 1 所示。
圖 1  有序集合的數據結構
有序集合是依賴 key 標示它是屬於哪個集合,依賴分數進行排序,所以值和分數是必須的,而實際上不僅可以對分數進行排序,在滿足一定的條件下,也可以對值進行排序。

三、Redis HyperLogLog(基數)

基數是一種算法。舉個例子,一本英文著作由數百萬個單詞組成,你的內存卻不足以存儲它們,那麼我們先分析一下業務。

英文單詞本身是有限的,在這本書的幾百萬個單詞中有許許多多重複單詞,扣去重複的單詞,這本書中也就是幾千到一萬多個單詞而已,那麼內存就足夠存儲它們了。

比如數字集合 {1,2,5,7,9,1,5,9} 的基數集合爲 {1,2,5,7,9} 那麼基數(不重複元素)就是 5個,基數的作用是評估大約需要準備多少個存儲單元去存儲數據,但是基數的算法一般會存在一定的誤差(一般是可控的)。Redis 對基數數據結構的支持是從版本 2.8.9 開始的。

基數並不是存儲元素,存儲元素消耗內存空間比較大,而是給某一個有重複元素的數據集合(一般是很大的數據集合)評估需要的空間單元數,所以它沒有辦法進行存儲,加上在工作中用得不多,所以基數就介紹到這兒了。

四、總結

通過前面的文章我們已經瞭解了Redis的一些基礎內容和六種數據結構,日常工作中我們主要使用到的Redis高速的讀寫速度來優化我們的應用打開速度,利用到的數據結構也是以字符串、哈希爲主。後面的文章我們將會講到一些Redis的高級用法,譬如Redis哨兵、集羣、持久化及一些緩存淘汰策略模式、發佈訂閱等等。愛學的你們要持續關注該Redis專題哦~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章