本文实现一种基于java的分布式固定时间窗口计数器算法
//每次请求进来,查询一下当前的计数值,如果超出请求数阈值,则拒绝请求,返回系统繁忙提示
private long limitFlow(String key) {
//Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。设置成功返回1,设置失败返回0
Long lng = redisCacheClient.setnx(jedisGroup, key, "1");
if (lng == 1) {
//设置时间窗口,redis-key时效为10秒
redisCacheClient.expire(jedisGroup, key, 10);
return 1L;
} else {
//Redis Incrby 命令将 key 中储存的数字加上指定的增量值。相当于放在redis中的计数器,每次请求到来计数器自增1
long val = redisCacheClient.incrBy(jedisGroup, key, 1);
return val;
}
}