Redis:19---常用功能之(HyperLogLog)
一、HyperLogLog概述
HyperLogLog并不是一種新的數(shù)據(jù)結(jié)構(gòu)(實際類型為字符串類型),而是一種基數(shù)算法,通過HyperLogLog可以利用極小的內(nèi)存空間完成獨立總數(shù)的統(tǒng)計,數(shù)據(jù)集可以是IP、Email、ID等
HyperLogLog提供了3個命令:pfadd、pfcount、pfmerge
?
二、添加(pfadd)
pfadd key element [element …]pfadd用于向HyperLogLog添加元素,如果添加成功返回1
例如:下面向一個名為2016_06_06:unique:ids的hyperloglog中添加4個元素
?
三、計算獨立用戶數(shù)(pfcount)
pfcount key [key …]pfcount用于計算一個或多個HyperLogLog的獨立總數(shù)
例如:接著上面的演示案例,2016_03_06:unique:ids的獨立總數(shù)為4:
?
內(nèi)存節(jié)省效果演示案例
①插入前使用info memory查看一下內(nèi)存占用率
?
②下面建立一個名為test.sh的腳本,執(zhí)行該腳本,向key為2016_05_01:unique:ids的HyperLogLog中插入100萬個元素(循環(huán)每次插入1000條)
?
③執(zhí)行完腳本之后,再次查看內(nèi)存,發(fā)現(xiàn)內(nèi)存只增加了14K左右
④但是,使用pfcount查看結(jié)果,發(fā)現(xiàn)執(zhí)行的結(jié)果并不止100萬個
⑤現(xiàn)在改為使用集合類型進行測試,那么可以看到內(nèi)存使用率在腳本執(zhí)行完之后漲到了幾十MB,但是獨立用戶數(shù)為100萬
下圖列出了使用集合類型和HperLogLog統(tǒng)計百萬級用戶的占用空間對比:
數(shù)據(jù)類型 | 1天 | 1月 | 1年 |
集合類型 | 80M | 2.4G | 28G |
HperLogLog | 15K | 450K | 5M |
可以看到,HyperLogLog內(nèi)存占用量小得驚人,但是用如此小空間來估算如此巨大的數(shù)據(jù),必然不是100%的正確,其中一定存在誤差率。Redis官方給出的數(shù)字是0.81%的失誤率
四、合并(pfmerge)
pfmerge destkey sourcekey [sourcekey ...]pfmerge可以求出多個HyperLogLog的并集并賦值給destkey
例如:要計算 2016年3月5日和3月6日的訪問獨立用戶數(shù),可以按照如下方式來執(zhí)行,可以看到最終獨立用戶數(shù)是7:
五、HyperLogLog優(yōu)缺點與使用建議
HyperLogLog內(nèi)存占用量非常小,但是存在錯誤率
開發(fā)者在進行數(shù)據(jù)結(jié)構(gòu)選型時只需要確認如下兩條即可:
只為了計算獨立總數(shù),不需要獲取單條數(shù)據(jù)
可以容忍一定誤差率,畢竟HyperLogLog在內(nèi)存的占用量上有很大的優(yōu)勢
總結(jié)
以上是生活随笔為你收集整理的Redis:19---常用功能之(HyperLogLog)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++(STL):22 ---序列式容器
- 下一篇: linux cmake编译源码,linu