2 回答

TA贡献1831条经验 获得超10个赞
如果这是为了简单的速率限制,那么使用排序集的滑动窗口方法是我们看到的大多数Redis用户实现的,https://github.com/Redislabs-Solution-Architects/RateLimitingExample/blob/sliding_window/app.py
如果您设置在泄漏的存储桶上,则可以考虑使用每个消费者ID(api令牌/ IP地址等)的redis流,如下所示
请求进入消费者 ID
XADD 请求-[消费者 ID] MAXLEN [存储桶大小]
生成一个 go 例程(如果该使用者 ID 需要),如果请求的 XLEN ([使用者 ID] 为 0,则获取当前时间
XREAD 计数 [number_of_requests_per_period] 块 [时间段 - 1 毫秒] 流请求 -[使用者 ID] 获取当前时间并在剩余时间段内休眠
https://redis.io/commands#stream 详细介绍了流的工作原理

TA贡献1810条经验 获得超5个赞
有几种方法可以实现泄漏的存储桶,但该过程应该有两个单独的部分。一个将内容放入存储桶中,另一个在有要删除的内容时按设定的时间间隔删除它们。
您可以使用单独的 goroutine,该 goroutine 将按设定的时间间隔使用消息。这将简化您的代码,因为在一个代码路径上,您只需要查看队列大小并丢弃数据包,而另一个代码路径将仅使用任何存在的内容。
- 2 回答
- 0 关注
- 92 浏览
添加回答
举报