一種千萬級用戶實(shí)時(shí)統(tǒng)計(jì)用戶數(shù)的簡單實(shí)現(xiàn)
場景:微信小程序注冊用戶已經(jīng)接近千萬,而且分為實(shí)名用戶和非實(shí)名用戶,openId為小程序的用戶id,一個(gè)實(shí)名用戶可以有多個(gè)微信,所以可以多次注冊,但是實(shí)名信息為同一個(gè)人。
需求:實(shí)時(shí)顯示用戶增長量,實(shí)名用戶量,實(shí)名去重用戶數(shù),最近七日的用戶變化曲線等。
實(shí)現(xiàn):spring aop + redis atomlong + crontab shell腳本
思路:
1、每天凌晨3點(diǎn)執(zhí)行一次定時(shí)任務(wù),從msyql從庫讀取用戶數(shù)據(jù),做以上處理,然后獲得統(tǒng)計(jì)數(shù)據(jù)作為基準(zhǔn)值,寫入redis。
2、aop對用戶表的update、insert操做進(jìn)行攔截處理,由于業(yè)務(wù)場景一般對用戶都是邏輯刪除,所以不需要去切delete操作。
3、根據(jù)update中的實(shí)名參數(shù)信息判斷該次update是不是實(shí)名數(shù)據(jù)更新,通過實(shí)時(shí)根據(jù)身份證去查之前該用戶是否已經(jīng)有其他微信號進(jìn)行過實(shí)名(這里有一次數(shù)據(jù)庫的交互,對身份證號要建索引)。
insert操作肯定是用戶的增長,這個(gè)很好理解。
4、redis中根據(jù)業(yè)務(wù)key+日期的方式對一周內(nèi)數(shù)據(jù)進(jìn)行緩存,用于頁面展示一周用戶增長曲線。
5、具體切面的核心代碼如下: