遇到这种场景:要求某个接口1s最多请求10次,在分布式环境下guava的RateLimiter用不上。redis可以满足需求,于是baidu一下redis分布式限流的代码实现,总结看基本分为两种,脚本实现、非脚本实现。非脚本实现缺点明显,lua实现优势满满,肯定用lua啊啊啊啊。但是还是要看下非脚本实现的坑在哪里,lua实现的两种方式:均匀实现和非均匀实现。当然用lua的均匀实现方式是最好用的,也是推荐的。
看具体的实现之前,还是给一个场景:限定登录接口1s最多请求5次
非脚本实现
实现思路:用String结构,value存储当前登录次数,设置key的过期时间是1s。所以只要key没过期并且value<10就可以继续登录。
private boolean accessLimit(String ip, int limit, int time, Jedis jedis) {
bool