文章目錄
- HyperLogLog
-
- 相關操作
- Bitmaps
HyperLogLog
- Redis 在 2.8.9 版本添加了 HyperLogLog 結構。
- Redis HyperLogLog 是用來做基數統計的算法,HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定 的、并且是很小的。
- 在 Redis 裡面,每個 HyperLogLog 鍵隻需要花費 12 KB 記憶體,就可以計算接近 2 6 4 2^64 264 個不同元素的基 數。這和計算基數時,元素越多耗費記憶體就越多的集合形成鮮明對比。
- 但是,因為 HyperLogLog 隻會根據輸入元素來計算基數,而不會儲存輸入元素本身,是以 HyperLogLog 不能像集合那樣,傳回輸入的各個元素。
-
什麼是基數?
比如資料集 {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
- 位圖,操作二進制位來進行記錄,就隻有0和1兩個狀态。
-
執行個體:
簽到,有學号為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