在指定的时间t中允许使用有限的用户行为,仅n次。Supposet为1秒,n是1000次。
程序员设计了当前限制方案,该方案仅允许每分钟1000次。如图01:00s-02:00所示,仅允许1,000次访问。-02:00s要求1,000次,02:00s-02:01s要求1,000次。在这种情况下,在0.02之间要求01:59S-02:01S间隔。物种设计是错误的。
在指定的时间t中,仅允许n次。我们可以将此指定的时间t视为滑动时间窗口(固定宽度)。我们使用redis的zset基本数据类型的分数来循环此滑动时间窗口。ZSET的实际操作,我们只需要将数据保留在此滑动时间窗口中,并且可以处理其他数据。
代码实现的逻辑是计算滑动窗口中ZSET中的行为数量,并将其直接与阈值MaxCount进行比较以确定是否允许当前行为。效率
测试代码:
测试效果:从测试输出的数据中,可以看出限制效果。第11次失败后的请求操作,但是我们允许的五个错误相对较大。此问题的原因是我们测试系统的毫秒。CurrentTimillis()可能是相同的,此时,该值为也与system.currentttttttimemilis()相同,这将在zset中导致元素覆盖!
修改代码测试:睡眠1毫秒在周期中,测试结果满足期望!
我们在项目中使用原子LUA脚步来实现更多当前用途,因此在这里还提供了基于操作ZSET的LUA版本
测试代码没有变化。您可以自己测试。请记住,当我们测试时,相等系统的问题是必要的。不要相信您输出系统。CurrentTttimeMillis()!考虑到问题,该技术实际上在我心中!