项目代码地址: 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, L