一、HyperLogLog概述
HyperLogLog并不是一種新的數據結構(實際類型為字符串類型),而是一種基數算法,通過HyperLogLog可以利用極小的內存空間完成獨立總數的統計,數據集可以是IP、Email、ID等
HyperLogLog提供了3個命令:pfadd、pfcount、pfmerge
?
二、添加(pfadd)
pfadd key element [element …]
pfadd用于向HyperLogLog添加元素,如果添加成功返回1
例如:下面向一個名為2016_06_06:unique:ids的hyperloglog中添加4個元素
?
三、計算獨立用戶數(pfcount)
pfcount key [key …]
pfcount用于計算一個或多個HyperLogLog的獨立總數
例如:接著上面的演示案例,2016_03_06:unique:ids的獨立總數為4:
?
內存節省效果演示案例
①插入前使用info memory查看一下內存占用率
?
②下面建立一個名為test.sh的腳本,執行該腳本,向key為2016_05_01:unique:ids的HyperLogLog中插入100萬個元素(循環每次插入1000條)
elements=""
key="2016_05_01:unique:ids"
for i in `seq 1 1000000`
do
elements="${elements} uuid-"${i}
if [[ $((i%1000)) == 0 ]];
then
redis-cli pfadd ${key} ${elements}
elements=""
fi
done
?
③執行完腳本之后,再次查看內存,發現內存只增加了14K左右
④但是,使用pfcount查看結果,發現執行的結果并不止100萬個
⑤現在改為使用集合類型進行測試,那么可以看到內存使用率在腳本執行完之后漲到了幾十MB,但是獨立用戶數為100萬
elements=""
key="2016_05_01:unique:ids:set"
for i in `seq 1 1000000`
do
elements="${elements} "${i}
if [[ $((i%1000)) == 0 ]];
then
redis-cli sadd ${key} ${elements}
elements=""
fi
done
下圖列出了使用集合類型和HperLogLog統計百萬級用戶的占用空間對比:
數據類型 | 1天 | 1月 | 1年 |
集合類型 | 80M | 2.4G | 28G |
HperLogLog | 15K | 450K | 5M |
可以看到,HyperLogLog內存占用量小得驚人,但是用如此小空間來估算如此巨大的數據,必然不是100%的正確,其中一定存在誤差率。Redis官方給出的數字是0.81%的失誤率
四、合并(pfmerge)
pfmerge destkey sourcekey [sourcekey ...]
pfmerge可以求出多個HyperLogLog的并集并賦值給destkey
例如:要計算 2016年3月5日和3月6日的訪問獨立用戶數,可以按照如下方式來執行,可以看到最終獨立用戶數是7:
五、HyperLogLog優缺點與使用建議
HyperLogLog內存占用量非常小,但是存在錯誤率
開發者在進行數據結構選型時只需要確認如下兩條即可:
只為了計算獨立總數,不需要獲取單條數據
可以容忍一定誤差率,畢竟HyperLogLog在內存的占用量上有很大的優勢