技術派redis實現(xiàn)用戶活躍排行榜學習
首先定義一個參數(shù)實體來涵蓋業(yè)務場景所需要的參數(shù), 如點贊 評論等。
梳理業(yè)務流程 :
增加活躍度:先做一個冪等來防止重復加分(創(chuàng)建一個用戶行為的哈希表 userAction userAction由用戶id和當下時間組成 里面的字段由用戶對某一篇文章的具體行為組成 即文章id+用戶行為)如果字段不存在 說明當前用戶并未進行有關操作 則下一步可以給有關操作字段加分。
減少活躍度:把相關操作字段刪除(下次就可以再加回來 比如點贊 取消 再點贊),減去對應的分數(shù)。
榜單更新:日榜和月榜,建立兩個有序集合,用戶id作字段。每次把用戶行為產(chǎn)生的分數(shù)加進去。同時設置過期時間。
榜單查詢:通過有序集合對分數(shù)進行排序 再獲得用戶id 用用戶id查詢一些用戶的簡單的信息 呈現(xiàn)在榜單中
同時 作者提出了五個拓展問題
1.如何做防刷?
2.并發(fā)問題怎么規(guī)避?
3.由非原子的redis操作,引入的事務問題怎么避免?
4.性能測試可以怎么進行?
5.數(shù)據(jù)量大時存儲用戶的操作記錄內(nèi)存占用龐大怎么解決?
我的思考如下:
1.對于防刷,可以有簡單限流:定義一個變量 如day_limit_praise 記錄用戶一天點贊文章的數(shù)量,并給個上限,超過則對用戶進行提示?;瑒哟翱谙蘖?: 維護一個固定時長的時間窗口(如一分鐘)用有序集合 字段和值都是時間 每次有新請求來的時候都更新集合 保證最大間隔只有一分鐘 當這個集合超過一定大小 提醒用戶。行為模式識別:分析操作序列識別機器人行為。通過list記錄用戶操作序列 然后遍歷分析是否存在大量連續(xù)點贊 取消 點贊 取消這樣的操作 然后對相應的用戶發(fā)送驗證碼并限制操作。
2.redis單線程讓它的命令具有天然的原子性 所以zincr本身就是原子操作,不需要額外鎖機制 。其他的場景還沒學到 先這樣吧
3.用lua腳本 使用樂觀鎖watch
4.使用相關工具 如 JMeter、Gatling。
5.冷熱數(shù)據(jù)分離 對近期的數(shù)據(jù)存在redis 較早的數(shù)據(jù)存在mysql 定時歸檔。 設置合理的過期時間, 動態(tài)調(diào)整 :每次訪問數(shù)據(jù)都延長它的過期時間
暫時先這樣,萬能的牛油們能不能給點建議,謝謝!