天天看點

【Redis】三種特殊資料類型——HyperLogLog、BitmapsHyperLogLogBitmaps

文章目錄

  • HyperLogLog
    • 相關操作
  • Bitmaps

HyperLogLog

  1. Redis 在 2.8.9 版本添加了 HyperLogLog 結構。
  2. Redis HyperLogLog 是用來做基數統計的算法,HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定 的、并且是很小的。
  3. 在 Redis 裡面,每個 HyperLogLog 鍵隻需要花費 12 KB 記憶體,就可以計算接近 2 6 4 2^64 264 個不同元素的基 數。這和計算基數時,元素越多耗費記憶體就越多的集合形成鮮明對比。
  4. 但是,因為 HyperLogLog 隻會根據輸入元素來計算基數,而不會儲存輸入元素本身,是以 HyperLogLog 不能像集合那樣,傳回輸入的各個元素。
  5. 什麼是基數?

    比如資料集 {1, 3, 5, 7, 5, 7, 8}, 那麼這個資料集的基數集為 {1, 3, 5 ,7, 8}, 基數(不重複元素)為5。 基數估計就是在誤差可接受的範圍内,快速計算基數。

相關操作

127.0.0.1:6379> pfadd mykey a b c d e f g h i j
(integer) 1
127.0.0.1:6379> PFCOUNT mykey  # 統計基數
(integer) 10
127.0.0.1:6379> pfadd mykey2 a s d f g h j k l
(integer) 1
127.0.0.1:6379> PFCOUNT mykey2
(integer) 9
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2  # 求并集
OK
127.0.0.1:6379> PFCOUNT mykey3  #并集後基數個數
(integer) 13
           

Bitmaps

  1. 位圖,操作二進制位來進行記錄,就隻有0和1兩個狀态。
  2. 執行個體:

    簽到,有學号為1~10号的10位同學進行簽到:1已簽到 0未簽到

127.0.0.1:6379> setbit sign 1 1  #setbit key...   1号已簽到
(integer) 0
127.0.0.1:6379> setbit sign 2 0 #2号未簽到
(integer) 0
127.0.0.1:6379> setbit sign 3 1 #3号已簽到
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
127.0.0.1:6379> setbit sign 7 1
(integer) 0
127.0.0.1:6379> setbit sign 8 0
(integer) 0
127.0.0.1:6379> setbit sign 9 1
(integer) 0
127.0.0.1:6379> setbit sign 10 1
(integer) 0
127.0.0.1:6379> getbit sign 5  #檢視5号是否簽到
(integer) 1                    #已簽到
127.0.0.1:6379> getbit sign 8    #檢視8号是否簽到
(integer) 0                      #未簽到
127.0.0.1:6379> bitcount sign   #統計簽到人數
(integer) 7

           

繼續閱讀