Redis應用場景-計數器
計數器
計數器可以分爲:
- 簡單計數器,用incr就可以實現;
- 有有效期的計數器,設置key的有效期就可以實現;
- 簡單的去重計數器,用set實現;
- 高併發大數去重計數器,用hll實現;
視頻播放次數
B站視頻播放次數
簡單的統計視頻播放次數,不去重:
incr bilibili:counter:play:vedio:bv001
優點:精確統計,內存花銷少;
缺點:不知道播放視頻的都是哪些用戶,不支持去重。
統計視頻播放次數,按用戶id去重:
# 模擬用戶點播
sadd bilibili:played:vedio:bv001 uid001
sadd bilibili:played:vedio:bv001 uid002
sadd bilibili:played:vedio:bv001 uid003
sadd bilibili:played:vedio:bv001 uid001
# 計算去重後的播放次數
scard bilibili:played:vedio:bv001
優點:精確統計,知道播放視頻的都是哪些用戶,支持去重。
缺點:內存花銷大。
如果視頻數量很大,且播放量很高時,又要求去重統計時,可以使用Redis HyperLogLog(HLL)來做概率計算:
# 模擬用戶點播
pfadd bilibili:playedusers:vedio:bv001 uid001
pfadd bilibili:playedusers:vedio:bv001 uid002
pfadd bilibili:playedusers:vedio:bv001 uid003
pfadd bilibili:playedusers:vedio:bv001 uid001
pfadd bilibili:playedusers:vedio:bv001 uid002
# 計算去重後的播放次數
pfcount bilibili:playedusers:vedio:bv001
優點:內存花銷小,支持去重。
缺點:統計會有誤差。
參考:
防止刷單
秒殺活動時,限制單個IP或用戶單位時間內請求接口的次數。
特點:一個有有效期的計數器。
比如,10秒鐘內單個IP請求接口次數超過5次時,提示操作過於頻繁。
# 模擬客戶端對商品product001發起下單
incr iplimit:product001:192.168.0.31
# 設置限制有效期爲10妙
expire iplimit:product001:192.168.0.31 10
# 模擬客戶端繼續發起請求
incr iplimit:product001:192.168.0.31
incr iplimit:product001:192.168.0.31
incr iplimit:product001:192.168.0.31
incr iplimit:product001:192.168.0.31
# 判斷是否達到限制次數
get iplimit:product001:192.168.0.31
也可以根據用戶id進行限制
incr uidlimit:product001:uid001
參考:
限制登錄失敗次數
3分鐘內連續3次登錄失敗,賬號被鎖定5分鐘。
特點:一個有效期定時器 + 一個有效期的黑名單。
# 模擬首次登錄失敗,設置登錄失敗有效期爲3分鐘(180秒)
incr loginfailed:user01
expire loginfailed:user01 180
# 模擬繼續登錄失敗
incr loginfailed:user01
incr loginfailed:user01
# 判斷登錄失敗次數是否達到限制
get loginfailed:user01
# 鎖定賬號5分鐘(300秒)
setex lockeduser:user01 300 user01
# 判斷賬號是否已鎖定
get lockeduser:user01