基本架构
关于限流的三种经典算法
限流:计数器、漏桶、令牌桶 三大算法的原理与实战(史上最全)_漏桶算法-CSDN博客
基于令牌桶算法的限流策略流程
可以确保一个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应当被放到哪个槽中,集群中的每个节点负责一部分哈希槽。