[toc]
## 簡述
HyperLogLog 提供不精確的去重計數方案,用于記錄大數據量的計數(如,網站的uv),雖然不精確但是也不是非常不精確,標準誤差是 0.81%。
## 使用方法
HyperLogLog 提供了兩個指令 pfadd 和 pfcount,根據字面意義很好理解,一個是增加計數,一個是獲取計數。pfadd 用法和 set 集合的 sadd 是一樣的,來一個用戶 ID,就將用戶 ID 塞進去就是。pfcount 和 scard 用法是一樣的,直接獲取計數值。
```
127.0.0.1:6379> pfadd codehole user1
(integer) 1
127.0.0.1:6379> pfcount codehole
(integer) 1
```
接下來我們使用腳本,往里面灌更多的數據,看看它是否還可以繼續精確下去,如果不能精確,差距有多大。
```
import redis
client = redis.StrictRedis()
for i in range(100000):
client.pfadd("codehole", "user%d" % i)
print 100000, client.pfcount("codehole")
```
```
> python pftest.py 100000 99723
```
### pfmerge
HyperLogLog 除了上面的 pfadd 和 pfcount 之外,還提供了第三個指令 pfmerge,用于將多個 pf 計數值累加在一起形成一個新的 pf 值。
比如在網站中我們有兩個內容差不多的頁面,運營說需要這兩個頁面的數據進行合并。其中頁面的 UV 訪問量也需要合并,那這個時候 pfmerge 就可以派上用場了。