本文实现一种基于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; } }