Redis應用場景-計數器

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

參考文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章