Redis实现API接口限流之滑动窗口算法
1. 引言
本文为了填补上一篇的坑点,有兴趣的小伙伴可以先去了解上一篇的固定窗口详解:
Redis实现API接口限流之固定窗口算法
如上图所示,固定窗口和滑动窗口的区别一目了然,回到上一篇坑点的结论就是:固定窗口无法完美规避固定时间临界点的流量冲击。而滑动窗口则是一个动态窗口,它会随着时间的推移不断前移,动态更新某时间范围内的数据,下面直接上干货。
2.上干货
2.1 lua脚本
不少小伙伴可能对lua脚本不太熟悉,因为平时确实接触得比较少。不过关于Redisson的分布式锁,想必大家也都耳濡目染了,其获取锁的原理就是基于lua脚本的原子性。
rateLimiter.lua:编写属于我们限流业务的lua脚本
--获取KEY
local key = KEYS[1]
--获取ARGV内的参数
-- 缓存时间
local expire = tonumber(ARGV[1])
-- 当前时间
local currentMs = tonumber(ARGV[2])
-- 最大次数
local count = tonumber(ARGV[3])
--窗口开始时间
local windowStartMs = currentMs - expire * 1000;
--获取key的次数
local current = redis.call('zcount', key, windowStartMs, currentMs)
--如果key的次数存在且大于预设值直接返回当前key的次数
if current and t