RedisCell限流Redis模块

编程

redis 4.0 以后开始支持扩展模块,redis-cell 是一个用rust语言编写的基于令牌桶算法的的限流模块,提供原子性的限流功能,并允许突发流量,可以很方便的应用于分布式环境中。

该模块只有1条指令cl.throttle,它的参数和返回值都略显复杂,接下来让我们来看看这个指令具体该如何使用。

> cl.throttle laoqian:reply 15 30 60 1

▲ ▲ ▲ ▲ ▲

| | | | └───── need 1 quota (可选参数,默认值也是1)

| | └──┴─────── 30 operations / 60 seconds 这是漏水速率

| └───────────── 15 capacity 这是漏斗容量

└─────────────────── key laoqian

上面这个指令的意思是允许「用户老钱回复行为」的频率为每 60s 最多 30 次(漏水速率),漏斗的初始容量为 15,也就是说一开始可以连续回复 15 个帖子,然后才开始受漏水速率的影响。我们看到这个指令中漏水速率变成了 2 个参数,替代了之前的单个浮点数。用两个参数相除的结果来表达漏水速率相对单个浮点数要更加直观一些。

> cl.throttle laoqian:reply 15 30 60

1) (integer) 0 # 0 表示允许,1表示拒绝

2) (integer) 15 # 漏斗容量capacity

3) (integer) 14 # 漏斗剩余空间left_quota

4) (integer) -1 # 如果拒绝了,需要多长时间后再试(漏斗有空间了,单位秒)

5) (integer) 2 # 多长时间后,漏斗完全空出来(left_quota==capacity,单位秒)

在执行限流指令时,如果被拒绝了,就需要丢弃或重试。cl.throttle 指令考虑的非常周到,连重试时间都帮你算好了,直接取返回结果数组的第四个值进行 sleep 即可,如果不想阻塞线程,也可以异步定时任务来重试。

以上是 RedisCell限流Redis模块 的全部内容, 来源链接: utcz.com/z/510716.html

回到顶部