Why you shouldn't use Redis as a rate limiter
9 months ago
- #Redis
- #Performance
- #Rate Limiting
- 许多公司使用Redis进行速率限制,但作者认为这种方法存在问题。
- 最初尝试用Redis实现速率限制时采用了固定窗口和基于时间的键,但这些方法存在重大缺陷。
- 固定窗口实现可能导致键错误地过期或根本不过期,从而导致速率限制失效。
- 基于时间的键解决方案可能遇到同步问题和'丢失EXPIRE'错误,即键可能永远不会过期。
- 滑动日志窗口方法虽然更精确,但效率低下且仍无法执行真正的速率限制。
- 令牌桶算法被视为速率限制的黄金标准,但在不使用Lua脚本的情况下难以在Redis中实现。
- Redis中的Lua脚本可以正确执行速率限制,但需要通过复杂的、会暂停数据库的操作,这违背了使用Redis的初衷。
- 许多已发布的Redis速率限制解决方案存在重大缺陷,包括竞态条件和内存耗尽漏洞。
- 作者总结认为,由于Redis的固有局限性和正确实现的复杂性,它并不适合用于速率限制。