项目代码地址: https://github.com/tangaiyun/RedisRateLimiter
算法的核心思想是用redis中的有序集合来记录访问痕迹,集合的key与时间段序号强相关,集合中加入访问痕迹元素时,score值和member都来自于redis的当前精确到微秒的时间。
举例如果限制的时间单位为分钟,限制前缀为一个IP(128.9.9.23)访问频率,则当前有序集合的key的运算规则如下:
求出当前时间所处的分钟序号: long index = Long.parseLong(jedis.time().get(0)) / 60;
当前有序集合的key为:“128.9.9.23”+“:”+index

对于任意一次访问,设当前时间为T,如上图所示,我们要分别统计A、B 集合中一个统计区间的元素之和,则对于B集合来说,我们需要统计B集合中到目前为止所有的访问记录,其实就是B中的所有元素,简单一点的做法就是 redis.zcount(keyB, Long.MIN_VALUE,Long.MAX_VALUE)。对于A集合,统计的时间起始点为当前时间-单位时间, 命名为Ta,则Ta = T - 单位时间(微秒)
则A中满足条件的元素个数为 redis.zcount(keyA, Ta, Long.MAX_VALUE).

本文详细介绍了利用Redis有序集合设计的API访问频率控制器。通过记录IP对应的时间段序号的有序集合,结合Redis的zcount方法统计指定时间范围内的访问次数,以实现限流功能。代码已开源,文章还提及了有序集合的TTL管理以及成员值的设定策略,确保每个访问都能被准确计数。
最低0.47元/天 解锁文章
1210

被折叠的 条评论
为什么被折叠?



