Redis-Cell-限流 Redis 模块

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

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

> 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 个参数,替代了以前的单个浮点数。用两个参数相除的结果来表达漏水速率相对单个浮点数要更加直观一些。redis

> 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 便可,若是不想阻塞线程,也能够异步定时任务来重试。算法

相关文章
相关标签/搜索