系列文章算法
若是你要統計網站的PV,你可使用Redis計數器就行了,每來一個請求,調用一次incrby
便可。可是若是要統計UV就沒那麼簡單呢,它須要去重,固然你確定想到了Redis中的去重的Set
集合,當一個請求過來使用sadd
添加用戶ID,經過scard
取出集合的大小。可是若是上千萬的UV,使用集合來統計,就很是浪費空間了。而Redis提供的HyperLogLog
數據結構正是來解決這類統計問題的,固然在數據量很大的狀況下,他會有必定的偏差。微信
HyperLogLog
算法是一種很是巧妙的近似統計海量去重元素數量的算法。它內部維護了 16384 個桶(bucket)來記錄各自桶的元素數量。當一個元素到來時,它會散列到其中一個桶,以必定的機率影響這個桶的計數值。由於是機率算法,因此單個桶的計數值並不許確,可是將全部的桶計數值進行調合均值累加起來,結果就會很是接近真實的計數值。數據結構
具體的原理解析可參考探索HyperLogLog算法異步
HyperLogLog 使用比較簡單,主要提供提供了兩個指令分佈式
HyperLogLog還提供了第三個指令 pfmerge
,用於將多個 pf 計數值累加在一塊兒造成一個新的 pf 值。post
好比在網站中咱們有兩個內容差很少的頁面,運營須要將兩個頁面的數據進行合併。其中頁面的 UV 訪問量也須要合併,這時候就可使用pfmerge
。網站
HyperLogLog 實現中用到的是 16384 個桶,也就是 2^14,每一個桶的 maxbits 須要 6 個 bits 來存儲,最大能夠表示 maxbits=63,因而總共佔用內存就是2^14 * 6 / 8 = 12k字節code
本文亦在微信公衆號【小道資訊】發佈,歡迎掃碼關注! cdn