您好,登錄后才能下訂單哦!
這篇文章主要介紹Redis數據結構HyperLogLog怎么用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
HyperLogLog(下文簡稱為 HLL)是 Redis 2.8.9 版本添加的數據結構,它用于高性能的基數(去重)統計功能,它的缺點就是存在極低的誤差率。
HLL命令是以pf 它是 HyperLogLog 這個數據結構的發明人 Philippe Flajolet 的首字母縮寫
pfadd key elemnet [element]
pfadd 添加元素,如果添加成功返回1
127.0.0.1:6379> pfadd 2019-04-29:unique:ids u1 u2 u3 u4(integer) 1
計算一個或多個HyperLogLog的獨立總數
127.0.0.1:6379> pfcount 2019-04-29:unique:ids(integer) 4127.0.0.1:6379> pfadd 2019-04-29:unique:ids u1 u2 u3 u5(integer) 1127.0.0.1:6379> pfcount 2019-04-29:unique:ids(integer) 5
pfmerge destkey sourcekey [sourcekey ]
計算多個HyperLoglog的并集并賦值給destkey
127.0.0.1:6379> pfadd 2019-04-30:unique:ids u4 u2 u3 u6 u7(integer) 1127.0.0.1:6379> pfmerge 2019-04:unique:ids 2019-04-29:unique:ids 2019-04-30:unique:idsOK127.0.0.1:6379> pfcount 2019-04:unique:ids(integer) 7
HyperLogLog 內存占用量非常小,但是存在一定誤差率,redis官方給出的數字是0.81%的失誤率,開發中進行數據選型需要確認如下兩條即可:
只是為了計算獨立總數,不需要獲取單條數據
可以容忍一定誤差率。畢竟HyperLogLog 內存占用量非常小
如果統計 PV 那非常好辦,給每個網頁一個獨立的 Redis 計數器就可以了,這個計數器的 key 后綴加上當天的日期。這樣來一個請求,incrby 一次,最終就可以統計出所有的 PV 數據。
但是 UV 不一樣,它要去重,同一個用戶一天之內的多次訪問請求只能計數一次。這就要求每一個網頁請求都需要帶上用戶的 ID,無論是登陸用戶還是未登陸用戶都需要一個唯一 ID 來標識。
你也許已經想到了一個簡單的方案,那就是為每一個頁面一個獨立的 set 集合來存儲所有當天訪問過此頁面的用戶 ID。當一個請求過來時,我們使用 sadd 將用戶 ID 塞進去就可以了。通過 scard 可以取出這個集合的大小,這個數字就是這個頁面的 UV 數據。沒錯,這是一個非常簡單的方案。
但是,如果你的頁面訪問量非常大,比如一個爆款頁面幾千萬的 UV,你需要一個很大的 set 集合來統計,這就非常浪費空間。如果這樣的頁面很多,那所需要的存儲空間是驚人的。為這樣一個去重功能就耗費這樣多的存儲空間,值得么?其實老板需要的數據又不需要太精確,105w 和 106w 這兩個數字對于老板們來說并沒有多大區別,So,有沒有更好的解決方案呢?
這就是本節要引入的一個解決方案,Redis 提供了 HyperLogLog 數據結構就是用來解決這種統計問題的。HyperLogLog 提供不精確的去重計數方案,雖然不精確但是也不是非常不精確,標準誤差是 0.81%,這樣的精確度已經可以滿足上面的 UV 統計需求了。
HyperLogLog 數據結構是 Redis 的高級數據結構,它非常有用,但是令人感到意外的是,使用過它的人非常少。
HyperLogLog 這個數據結構不是免費的,不是說使用這個數據結構要花錢,它需要占據一定 12k 的存儲空間,所以它不適合統計單個用戶相關的數據。如果你的用戶上億,可以算算,這個空間成本是非常驚人的。但是相比 set 存儲方案,HyperLogLog 所使用的空間那真是可以使用千斤對比四兩來形容了。
不過你也不必過于擔心,因為 Redis 對 HyperLogLog 的存儲進行了優化,在計數比較小時,它的存儲空間采用稀疏矩陣存儲,空間占用很小,僅僅在計數慢慢變大,稀疏矩陣占用空間漸漸超過了閾值時才會一次性轉變成稠密矩陣,才會占用 12k 的空間。
HLL 引入了分桶算法和調和平均數來使這個算法更接近真實情況。
分桶算法是指把原來的數據平均分為 m 份,在每段中求平均數在乘以 m,以此來消減因偶然性帶來的誤差,提高預估的準確性,簡單來說就是把一份數據分為多份,把一輪計算,分為多輪計算。
調和平均數指的是使用平均數的優化算法,而非直接使用平均數。
以上是“Redis數據結構HyperLogLog怎么用”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。