- 統計需求場景
- 場景:聚合統計
- 示例
- 累計用戶計算
- 新增用戶計算
- 留存用戶計算
- 缺點
- 示例
統計需求場景
1、統計每天的新增用戶數和第二天的留存用戶數;
場景:聚合統計
所謂的聚合統計,就是指統計多個集合元素的聚合結果
統計多個集合的共有元素(交集統計);
把兩個集合相比,統計其中一個集合獨有的元素(差集統計);
統計多個集合的所有元素(并集統計)
在剛才提到的場景中,統計每天的新增用戶數和第二天的留存用戶數,正好對應了聚合統計,
要完成這個統計任務,我們需要兩種集合,
- 用一個集合記錄所有登錄過 App 的用戶 ID;
- 使用 Set 型別記錄所有登錄過 App 的用戶 ID,把 key 設定為 alluser,表示記錄的是用戶 ID,value 就是一個 Set 集合,里面是所有登錄過 App 的用戶 ID,我們可以把這個 Set 叫作累計用戶 Set,
- 用另一個集合記錄每一天登錄過 App 的用戶 ID,
- 每日用戶 Set記錄到一個新集合Set中,key 是 user 以及當天日期,例如 user:20210802; value 是 Set 集合,記錄當天登錄的用戶 ID,
在統計每天的新增用戶時,我們只用計算每日用戶 Set 和累計用戶 Set 的差集就行,
示例
假設有一個新用戶 2021年8月2日上線,那么,8月2日前是沒有用戶的,
此時,累計用戶Set 是空集,當天登錄的用戶 ID 會被記錄到 key 為 user:20210802的 Set 中,所以,user:20210802這個 Set 中的用戶就是當天的新增用戶,
累計用戶計算
然后,我們計算累計用戶 Set 和 user:20210802 Set 的并集結果,結果保存在 alluser 這個累計用戶 Set 中,如下所示:
SUNIONSTORE alluser alluser user:20210802
這個時候,user:id 這個累計用戶 Set 中就有了 8 月 2 日的用戶 ID,等到 8 月 3 日再統計時, 我們把 8 月 3 日登錄的用戶 ID 記錄到 user:20210803 的 Set 中,
新增用戶計算
接下來,我們執行SDIFFSTORE 命令計算累計用戶 Set 和 user:20210803 Set 的差集,結果保存在 key 為 user:new 的 Set 中,如下所示:
SDIFFSTORE user_new user:20210803 alluser
user_new 這個 Set 中記錄的就是 8 月 3 日的新增用戶
留存用戶計算
計算8 月 3 日的留存用戶時,我們只需要再計算 user:20210802 和 user:20210803 兩個 Set 的交集,就可以得到同時在這兩個集合中的用戶 ID 了,這些就是在 8 月 2 日登錄,并且在 8 月 3 日留存的用戶,執行的命令如下:
SINTERSTORE user_rem user:20210802 user:20210803
缺點
當需要對多個集合進行聚合計算時,Set 型別會是一個非常不錯的選擇,不過,這里有一個潛在的風險,
Set 的差集、并集和交集的計算復雜度較高,在資料量較大的情況下,如果直接執行這些計算,會導致 Redis 實體阻塞,所以,建議:
- 從主從集群中選擇一個從庫,讓它專門負責聚合計算,
- 或者是把資料讀取到客戶端,在客戶端來完成聚合統計,這樣就可以規避阻塞主庫實體和其他從庫實體的風險了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/291713.html
標籤:其他
上一篇:你一定要知道的SQL優化技巧
