基于Redis的令牌桶限流算法

73 阅读1分钟

基本架构

限流器.jpg

关于限流的三种经典算法

限流:计数器、漏桶、令牌桶 三大算法的原理与实战(史上最全)_漏桶算法-CSDN博客

基于令牌桶算法的限流策略流程

令牌桶算法.jpg

可以确保一个lua脚本中包含的多个指令可以一起执行,避免了get后数据发生变化的问题。

配置实例:

{capacity1, fillTime1, capacity2, filltTime2}

注意上述限流策略可以配置多个interval下的tokens数量

引申

注意,由于该脚本中要通过两个不同的key获取需要的数据,即lastRefreshedTime和currentTokens,可能会引发引发 (error) CROSSSLOT Keys in request don't hash to the same slot异常,原因是在集群模式下,单次操作涉及多个 Key 时,这些 Key 被分配到不同的哈希槽(Slot),而 Redis 集群要求同一命令的所有 Key 必须位于同一槽中,这个问题可以使用HashTag来解决,即用花括号{}来搞包裹住多个不同key的相同部分,以让计算key的hash值时仅使用花括号包裹的相同部分去计算,这样这些不同的key都会映射到同一个slot中,如

key1: {ratelimit}_time
key2: {ratelimit}_tokens

如此一来,这两个key都会映射到同一个slot中

关于哈希槽映射: 哈希槽是一个key的集合,Redis集群共有16384个哈希槽,每个key通过CRC16散列然后对16384进行取模来决定该key应当被放到哪个槽中,集群中的每个节点负责一部分哈希槽。