Redis應用-HyperLogLog

系列文章算法

若是你要統計網站的PV,你可使用Redis計數器就行了,每來一個請求,調用一次incrby便可。可是若是要統計UV就沒那麼簡單呢,它須要去重,固然你確定想到了Redis中的去重的Set集合,當一個請求過來使用sadd添加用戶ID,經過scard取出集合的大小。可是若是上千萬的UV,使用集合來統計,就很是浪費空間了。而Redis提供的HyperLogLog數據結構正是來解決這類統計問題的,固然在數據量很大的狀況下,他會有必定的偏差。微信

HyperLogLog算法是一種很是巧妙的近似統計海量去重元素數量的算法。它內部維護了 16384 個桶(bucket)來記錄各自桶的元素數量。當一個元素到來時,它會散列到其中一個桶,以必定的機率影響這個桶的計數值。由於是機率算法,因此單個桶的計數值並不許確,可是將全部的桶計數值進行調合均值累加起來,結果就會很是接近真實的計數值。數據結構

具體的原理解析可參考探索HyperLogLog算法異步

使用方法

HyperLogLog 使用比較簡單,主要提供提供了兩個指令分佈式

  • pfadd 增長計數
  • pfcount 獲取計數

HyperLogLog還提供了第三個指令 pfmerge,用於將多個 pf 計數值累加在一塊兒造成一個新的 pf 值。post

好比在網站中咱們有兩個內容差很少的頁面,運營須要將兩個頁面的數據進行合併。其中頁面的 UV 訪問量也須要合併,這時候就可使用pfmerge網站

pf 的內存只有12k

HyperLogLog 實現中用到的是 16384 個桶,也就是 2^14,每一個桶的 maxbits 須要 6 個 bits 來存儲,最大能夠表示 maxbits=63,因而總共佔用內存就是2^14 * 6 / 8 = 12k字節code

本文亦在微信公衆號【小道資訊】發佈,歡迎掃碼關注! cdn

相關文章
相關標籤/搜索