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

参考文档

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