文章目录
前言
- 在Redis–Zset的语法和使用场景举例(朋友圈点赞,排行榜)一文中,提及了redis数据结构zset的指令语法和一些使用场景,今天我们使用zset来实现滑动窗口限流,详见下文。
什么是滑动窗口
-
滑动窗口是一种流量控制策略,用于控制一定时间内请求的访问数量。
-
其原理是:将时间划分成规定的时间片段,每个片段有固定的时间间隔,如1s,1min,1h,然后定义一个时间窗口,比如5s,5min等,该窗口会随着时间向右移动。此外还需要计数器计算窗口内的请求数。当窗口移动时,会把已经走过的时间片段的请求数删掉。每当请求进入系统时,会检查计数器中的请求数是否已经满了,如果计数未满,则请求允许被执行;否则执行相应的拒绝方法。

-
滑动窗口在时间内平滑地控制流量,而非简单地固定请求数与速率,可以更加灵活地突发流量和峰值流量。
zset实现滑动窗口
-
在redis中可以使用zset实现滑动窗口作为限流方案,假如接口A每一分钟只能访问100次,那么我们可以将这个需要限流的接口名作为key,value采用zset数据结构,zset的score设置为当前请求的时间戳,zset的member只需要保证唯一性即可。
-
涉及到的zset指令
向zset添加数据:zadd key score member
删除zset某个score范围内的数据: zremrangebyscore key min max
统计zset中数据的数量:zcard key -
代码实现:在代码中定义滑动窗口大小为"windowSize",收到请求后,在redis生成zset,用zremrangebyscore删除score小于当前时间戳减去"windowSize"的数据,使用zcard查询当前zset中的数据量,即请求量判断是否超出限制值,若超出则不加入zset。
public class RedisRateLimiter { private Jedis jedis; private String key; //窗口大小 private int windowsize; //限制访问的请求数 private Integer limitValue; public RedisRateLimiter(Jedis jedis, String key, int windowsize, Integer limitValue) { this.jedis = jedis; this.key

本文介绍了如何使用Redis的有序集合Zset实现滑动窗口限流机制,通过设置时间戳和成员唯一性来控制每分钟内接口的访问次数。同时提到了使用Lua脚本优化并发性能的问题,以及该方法在大流量场景下的存储空间消耗问题。

3301

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



