这个问题没有简单的答案。对于所有基于 NoSQL 或 SQL 的存储解决方案,有很多情况可能导致存储引擎的高延迟或缓慢。Redis 也不例外。
我建议从阅读开始:
以下是潜在原因的非详尽列表:
- 硬件不足(网络、内存、CPU)
- 基于软件的虚拟化(例如低端硬件上的 Xen)
- 内存不足,在操作系统级别生成交换
- 在单线程引擎中执行了太多 O(n) 操作(如 KEYS)
- 存储在 Redis 中的大型对象,导致通信缓冲区的不受控制的扩展
- 大量同时会话(> 30000)
- 每秒连接操作太多(Redis 不是网络服务器,连接应该是永久的,而不是瞬态的)。
- 客户端应用程序生成的往返次数过多(没有流水线或聚合命令使用)
- bgsave 或 AOF 重写生成的大型 fork 操作(尤其是在 VM 上)
- 使用 AOF 时的 I/O 相关延迟
- 同时触发多个过期操作的累积
- 客户端和主/从通信缓冲区内存累积,或日志数据缓慢
- 网络带宽消耗很大时的TCP incast 条件
- 使用分布式存储(尤其是多云存储,例如 EC2 EBS)来存储转储或 AOF 文件
可能还有许多其他原因,与您自己的应用程序产生的工作负载有关。
如果有人想到其他一般原因,我们可以将它们添加到此列表中。