案例一
业务场景需要根据指定时间限定操作次数,例如一分钟允许执行10次。
解决方案
方案一
- 设计计数器,记录调用次数,用于控制业务执行次数。以用户id作为key,使用次数作为value
- 在调用前获取次数,判断是否超过限定次数
不超过次数的情况下,每次调用计数+1
业务调用失败,计数-1 - 为计数器设置生命周期为指定周期,例如1秒/分钟,自动清空周期内使用次数
下面以10086用户ID为例进行讲解
首先进行获取当前次数:
get 10086
返回空值说明还未操作。
setex 10086 60 1
这样可以进行一直加
但是这样会有一个问题,在业务层需要每次判断是否达到响应的次数。
方案二
- 取消最大值的判定,利用incr操作超过最大值抛出异常的形式替代每次判断是否大于最大值
- 判断是否为nil,
如果是,设置为Max-次数
如果不是,计数+1
业务调用失败,计数-1
- 遇到异常即+操作超过上限,视为使用达到上限
下面以10087用户ID为例进行讲解
首先设置最大值-10
setex 10087 60 9223372036854775797
然后incr
当超过最大值时就会抛出异常,这样我们就不需要每次都判断是否达到10次了。