滑动窗口实现访问频率限制
使用redis的有序集合实现滑动窗口,从而实现对访问频率的限制
主要思路有两个
思路一
- 以时间戳为有序集合的成员
- 每次请求,先使用
ZREMRANGEBYLEX
命令移除窗口外的成员 - 使用
ZRANGE
命令获取有序集合的成员和相应权重 - 使用
ZINCRBY
命令对相应的成员的权重加一 - 使用
EXPIRE
命令重新设置有序集合有效期 - 对获取到的有序集合的成员的权重求和,并判断是否超过阈值
PHP实现
$maximum = 10; // 最大请求数量
$slidingWindow = 10; // 滑动窗口大小(s)
$now = time();
$redisKeyMod = 'pre:sliding_window:sorted_sets:%s';
$redisKey = sprintf($redisKeyMod, 'test.com');// 全站窗口
//$redisKey = sprintf($redisKeyMod, '/api/test/info');// 某个接口窗口
//$redisKey = sprintf($redisKeyMod, '{access-token}');// 某个access-token窗口
$redis = new Redis();
$redis->connect('192.168.10.5', 6379)