image-20240325084030703

常见限流算法

限流算法主要是为了防止系统过载或者应对突发流量,是一种用于控制数据流速度的技术。主要包括下面四种方法:

  • 固定窗口限流算法
  • 滑动窗口限流算法
  • 漏桶限流算法
  • 令牌桶限流算法

滑动窗口限流算法

有时候用户的一些无意义或者非法操作,例如频繁的发送短信、频繁的修改个人信息等操作就是无意义或者非法的,因此我们要针对这些操作进行限流。

限流的主要核心思路就是使用redis的zset结合滑动窗口限流算法,

针对这些行为,我设计了一个通用的接口,思路上是使用时间窗口限流算法,具体实现我使用zset进行的。

比如用户五分钟内只能发送三条验证码,于是就将用户发送短信的行为设计为redis的key,格式为:

场景:行为:用户唯一标识,zset的score分数值为时间戳,value值也是时间戳。

具体的流程为:

  • 当用户每次发生这样的限流行为,我就会在Redis中进行记录,

  • 在业务处理中,使用Redis的api进行查询,本质上就是调用了Redis的zcount命令去统计,传入开始score值和结束score值,我们以当前时间戳作为结束分值,然后使用当前时间去减去限流时间,例如五分钟,求出五分钟之前的时间戳,于是根据这两个时间戳作为score分值,查询这个范围中限流行为的发生次数,判断该行为一共触发了几次。

  • 后续的业务中,就根据不同的场景和需要进行校验。

漏桶算法

img

令牌桶算法

令牌桶算法控制令牌生成的速度,取令牌的速度不进行控制

image-20240428094748070

img