11. 億級訪問量數據處理
11.1 場景表述
- 手機APP用戶登錄信息,一天用戶登錄ID或設備ID
- 電商或者美團平臺,一個商品對應的評論
- 文章對應的評論
- APP上有打卡信息
- 網站上訪問量統計
- 統計新增用戶第二天還留存
- 商品評論的排序
- 月活統計
- 統計獨立訪客(Unique Vistitor UV)量
11.2 集合的統計模式
四種統計模式:聚合統計、排序統計、二值狀態統計、基數統計
11.2.1 聚合統計
多個集合的交集、差集、并集
set集合,來存儲所有登錄系統的用戶 user:id
set集合,來存儲當日新增用戶信息 user:id :20211222
假設系統是2021年12月22日上線,統計當天用戶
sadd user:id :20211222 1001 1002 1003 1004 1005
統計總用戶量
sunionstore user:id user:id user:id :20211222
第2天12月23日上線用戶
sadd user:id :20211223 1001 1003 1006 1007
統計當日新增用戶
sdiffstore user:new user:id :20211223 user:id
統計第一天登錄,第二天還在的用戶
sinterstore user:save user:id :20211222 user:id :20211223
統計第一天登錄,第二天流失的用戶
sdiffstore user:rem user:id : 20211222 user:id :20211223
11.2.2排序統計
List、Set 、Hash 、ZSet四種集合中,List和Zset是屬于有序的集合
一種使用List,通過lpush加入
一種使用Zset,按分數權重處理
11.2.3 二值狀態統計
統計疫苗接種人數(沒有接種0 接種1)、打卡(沒有打卡0 打卡1)、簽到。
bit位 1byte=8bit
redis提供一種擴展數據類型 bitmap。
- 常用命令
- setbit
- getbit
- bitcount
統計一下,2023年1月前10天上班打卡情況 0為未打卡,1為打卡
setbit user:sign:202301 1
setbit user:sign:202301 1 0
setbit user:sign:202301 2 1
setbit user:sign:202301 3 0
...
setbit user:sign:202301 8 1
setbit user:sign:202301 9 0
getbit user:sign:202301 1 //0 獲取第二天是否打卡
bitcount user:sign:202301 //5 獲取打卡成功的天數
bitcount user:sign:202301 0 1 // 后面可以跟兩個參數 統計從第0個字節開始,到第1個字節結束的數據 第二個數據為-1時表示統計所有數據
bitmap表示的是字節位置存儲的對應的數據
其保存過程為:
使用它進行統計大數據時極度節省內存
- 存儲1億用戶一天信息約使用12m的內存
- 但使用字符串保存時,1億用戶大概使用800M內存
假如有一個場景是需要3天當中都簽到的用戶,就是對bitmap進行與運算
bitop and signmap user:sign:1201 user:sign:1202 user:sign:1203
使用以上命令把三天同時登錄的用戶都存入到signmap
數組當中
11.2.4 基數統計
統計一個集合中不重復的元素個數,例如統計網頁的UV
- 第一種,使用set或者hash來完成統計
- sadd page1:uv u1001 u1002 u1003
- scard page1:uv
存在的問題:如果數據量非常大,且頁面多,訪問人數非常多,造成內存緊張
-
第二種,Redis提供了HyperLogLog(hll)
- HyperLogLog是用于統計基數的一種數據集合類型。優點在于當集合元素非常多,使用hll所需要的空間是固定且很小,使用12kb內存,可以存儲2^64個元素的基數。缺點在于統計規則是基于概率完成的。會有0.81%左右的誤差。如果統計1000萬次,實際上可以是1100萬 或900萬人。
-
命令
pfadd page1:uv u1001 u1002 u1003
添加數據pfcount page1:uv
統計數據pfadd page2:uv u1001 u1004
添加數據pfmerge page:uv page1:uv page2:uv
合并數據pfcount page:uv
統計數據
11.2.5小結
數據類型 | 聚合統計 | 排序統計 | 二值狀態統計 | 基數統計 |
---|---|---|---|---|
set | 支持差集、交集、并集 | 不支持 | 不支持 | 支持精確統計,數據量大時占用內存較大 |
zset | 支持差集、交集、并集 | 支持 | 不支持 | 支持精確統計,數據量大時占用內存較大 |
hash | 不支持 | 不支持 | 不支持 | 支持精確統計,數據量大時占用內存較大 |
list | 不支持 | 支持 | 不支持 | 不支持 |
bitmap | 與、或、異或運算 | 不支持 | 支持 | 支持精確統計,數據量大時占用內存較大 |
hyperloglog | 不支持 | 不支持 | 不支持 | 支持,采用概率算法,大數據量時,節省內存,但不精確 |