阿里云1折优惠链接:https://www.aliyun.com/minisite/goods?userCode=8hemam4l
时间窗口算法
又名滑动时间算法,所谓的滑动时间算法指的是以当前时间为截止时间,往前取一定的时间,比如取1s的时间,在这1s时间内最大的访问数为1000。把这1秒分为1000格,每格是1毫秒。
滑动时间窗口如下图所示:
其中每一个小格子代表1ms,比如1s允许200次请求,那么就分成1000个小格。
如何实现?
借助Redis的有序集合ZSet来实现时间窗口算法限流,实现的过程是:
第一步:先使用ZSet的key存储限流的ID,score用来存储请求的时间。
第二步:每次有请求访问来了之后,先判断当前时间(以ms为单位如:System.currentTimeMillis())往前推1000ms的时间,获取这两个值的数量,如果超过限流值,就实行限流。
代码如下:
package com.bxm.warcar.cache.test.fetcher;
import redis.clients.jedis.Jedis;