常见限流算法
限流算法主要是为了防止系统过载或者应对突发流量,是一种用于控制数据流速度的技术。主要包括下面四种方法:
- 固定窗口限流算法
- 滑动窗口限流算法
- 漏桶限流算法
- 令牌桶限流算法
滑动窗口限流算法
有时候用户的一些无意义或者非法操作,例如频繁的发送短信、频繁的修改个人信息等操作就是无意义或者非法的,因此我们要针对这些操作进行限流。
限流的主要核心思路就是使用redis的zset结合滑动窗口限流算法,
针对这些行为,我设计了一个通用的接口,思路上是使用时间窗口限流算法,具体实现我使用zset进行的。
比如用户五分钟内只能发送三条验证码,于是就将用户发送短信的行为设计为redis的key,格式为:
场景:行为:用户唯一标识,zset的score分数值为时间戳,value值也是时间戳。
具体的流程为:
当用户每次发生这样的限流行为,我就会在Redis中进行记录,
在业务处理中,使用Redis的api进行查询,本质上就是调用了Redis的
zcount
命令去统计,传入开始score值和结束score值,我们以当前时间戳作为结束分值,然后使用当前时间去减去限流时间,例如五分钟,求出五分钟之前的时间戳,于是根据这两个时间戳作为score分值,查询这个范围中限流行为的发生次数,判断该行为一共触发了几次。后续的业务中,就根据不同的场景和需要进行校验。
漏桶算法
漏铜算法的原理就是有一个容量固定的漏洞,会以一定的速度注入水流(指的是请求的流量),同时以一定的出水速度流出(指的是处理请求的速度),如果漏桶装满了,那么剩余的请求就会抛弃不再处理了。
令牌桶算法
令牌桶算法控制令牌生成的速度,取令牌的速度不进行控制