使用Redis統計UV資料 HyperLogLog

2021-09-19 05:26:40 字數 1291 閱讀 5351

只被計算一次

使用者量小,可以使用redis的set集合來進行統計

每有1個請求,就用sadd將使用者id新增進去,然後通過scard取值,即為uv資料

如果乙個頁面有幾千萬的uv,就需要乙個很大的set,很浪費空間

如果有十個或更多頁面,怎麼辦?只是為了統計uv,就要用掉這麼多空間,不值得

所以要用到redis的hyperloglog

pfadd:新增

pfcount:獲取總數

也可批量新增

pfmerge:資料合併

比如手機和顯示卡,都屬於電子產品,那麼它們的uv資料其實可以合併

hyperloglog的缺點就是統計會有誤差

1000條少了10條,再執行一遍,依舊少了10條,而且總數依然是990,說明可以去重

public

static

void

main

(string[

] args)

long total = jedis.

pfcount

("username");

system.out.

println

("1000 --- "

+ total)

; jedis.

close();}}

至於更大的資料量,可以自己去測試(伺服器太辣雞,一萬條資料都插不進去…)

誤差率不會太大,對於統計uv來說,並不影響

只要用了hyperloglog資料結構,它就要占用12k儲存空間,它不適合統計單個使用者的相關資料

至於什麼時候用,海量使用者,幾億,就用它,相比於set已經節約很多空間了

redis對hyperloglog進行了優化,用了稀疏矩陣儲存

隨著計數的變大,超過了閾值會變成稠密矩陣,才會占用12k儲存空間

UV統計 海量資料統計的前世今生

在網際網路公司中,每個專案都需要資料統計 分析,便於專案組利用詳細資料研究專案的整體情況,進行下一步的調整。在資料統計中,uv統計是最常見的,也是最普遍的。有的場景要求實時性很高,有點場景要求準確性很高,有的場景比較在意計算過程中的記憶體。不同的場景使用不同的演算法,下面我們從0到1簡單介紹下uv統...

redis統計各種活躍資料

舉個例子 假如乙個字串 z 他的ascii碼是122,二進位制是 0111 1010,offset 0就是從左往右數的第一位,offset 5就是從左往右數的第6位,這裡執行幾步操作 首先設定乙個string型別,key是 k value是 z 然後設定offset 6 為 0,offset 7 為...

使用redis的set集合做快取統計

快取是提高web專案運作效率的高效催化劑,合理的使用快取,能讓你的專案速度飛起來,業務 的分層抽象可能會將快取層封裝起來,導致無法顯式的過期 清理快取資料,我遇到的情況就是這樣,所以借助於redis的set型別來記錄快取資料的鍵值,實現可以手動過期相關資料的功能。redis 的 set 是 stri...