如果我們統計不重複數據的數量,比如統計獨立UV,我們會有如下方案:
原始方案:set
存儲每個用戶的id(字符串)
改進方案:bitmaps
存儲每個用戶狀態(bit)
全新的方案:HyperLogLog
基數
首先我們來認識一下基數
{1,3,5,7,5,7,8} 基數集{1,3,5,7,8} 基數:5
Hyperloglog類型的基本操作
- 添加數據
pfadd key element [element...]
- 統計數據
pfcount key [key...]
- 合併數據
pfmerge destkey sourcekey [sourcekey...]
操作如下:
h11爲key,隨便起,001,002代表用戶id,或者可以放ip地址、人名等都可以
相關說明
- 用於進行基數統計,不是集合,不保存數據,只記錄數量而不是具體數據
- 核心是基數估算算法,最終數值存在一定誤差
- 誤差範圍:基數估計得結果是一個帶有0.81%標準錯誤的近似值
- 耗空間極小,每個hyperloglog key佔用了12k的內存用於標記基數
- pfadd命令不是一次性分配12k內存使用,會隨着基數的增加內存逐漸增大
- pfmerge命令合併後佔用的存儲空間爲12k,無論合併之前數據是多少
一般使用場景
統計註冊 IP 數
統計每日訪問 IP 數
統計頁面實時 UV 數
統計在線用戶數
統計用戶每天搜索不同詞條的個數