本内容是对知名性能评测博主 Anton Putra Redis vs Memcached Performance Benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准
在本视频中,我们将对比 Redis 和 Memcached 。我会介绍一些功能上的不同,但主要关注 性能。
首先,我们会衡量缓存系统最重要的指标之一---
延迟(latency) ,使用 p99 百分位数 。缓存系统最常见的操作是 set(写入) 和 get(读取),因此我们将重点测试这两个操作。此外,我们还会衡量:
- 吞吐量(throughput):即每秒可处理的操作数
- 饱和度(saturation) :通过监控 CPU 使用率、内存使用率 以及 网络流量 来评估

所有测试均在 AWS 上运行,并使用与生产环境完全相同的基础设施。本次测试中,我们使用 m7a.medium 实例来运行 Redis 和 Memcached。众所周知,Redis 主要依赖 单线程,因此垂直扩展能力有限。
接下来,我会介绍测试设计。此外,我还使用了 EKS(Elastic Kubernetes Service) 集群,运行 Graviton 实例来部署监控组件,同时运行客户端以模拟负载。
什么是缓存?
假设你有一个典型的 三层架构:
- 客户端层:可能是浏览器或移动应用
- 逻辑层:运行应用程序和业务逻辑
- 数据层:用于持久化存储数据
举个例子,假设你运营一个 电商网站 ,所有 用户数据 和 商品信息 都存储在 关系型数据库 中。每当客户登录账户时,你需要展示他们的 姓名、收货地址 以及其他详细信息。
这些数据并不会频繁变更,但每次请求时,仍然需要查询数据库。如果你的用户数量较少,这还可以接受,但如果有成千上万的用户,这些查询 会变得越来越慢。
解决方案是:
当用户登录时,查询数据库并将数据存储在缓存中(例如 60 秒) 。
这样可以 提高用户体验,加快网站加载速度,并减少数据库负载。
你还可以缓存其他 SQL 查询 ,比如 最畅销商品 ,以便在首页展示。这就是缓存系统最初解决的问题---
缓存 SQL 查询结果,存入临时存储。
之后,缓存系统的使用场景不断扩展,并发展出了 持久化存储 等额外功能。
目前,Memcached 仍主要用于 缓存数据库查询 ,而 Redis 则发展出了 丰富的功能集。
测试设计
为了保证测试的公平性,我每次都会使用 Terraform 从 零 创建所有基础设施。

- 本次测试使用 medium(中等)实例 ,因为 Redis 是单线程的 ,只能通过 水平扩展(Redis 集群) 进行扩展。
- 另外,我创建了一个 EKS 集群 ,并部署 Prometheus、Grafana 等监控组件,还配置了 每种缓存 20 个客户端 来模拟负载。
- 我会 逐步增加客户端数量 ,直到 Redis 和 Memcached 都达到极限。
- 每次测试通常运行 1.5 - 2 小时。
配置概览
- 我使用当前最新版本:

- Redis 7.4.1
- Memcached 1.6.32

- Redis
- 采用最小化配置,保留大部分默认设置
- 禁用持久化
- 最大连接数设为 10,000

-
Memcached
- 默认内存从 64MB 增加到 4GB(与 VM 限制一致)
- 最大连接数同样设为 10,000
-
客户端

- 使用 Go 语言开发
- 内部集成 Prometheus 指标
- 采用 最流行、最高效的驱动
- 不使用内部缓存指标 ,而是通过 相同的直方图桶 从客户端端测量延迟,以确保测试更加准确。
第一次测试
接下来,我们开始运行测试。
在下方的图表中,你可以看到我们逐步增加客户端数量。
Redis 的 set(写入)延迟从一开始就比 Memcached 略慢 ,但 get(读取)延迟在最初几分钟几乎相同 。
然而,当负载增加时,情况开始发生变化。

- CPU 使用率 在整个测试过程中几乎相同
- 内存使用情况 也相似,但呈现出不同的模式:
- set 操作设置 20 秒的过期时间 ,因此 Redis 和 Memcached 每 20 秒都会删除数据
- 但 两者的内存清理方式不同
- 网络传输的数据量 也有一些不同
当操作数达到 50,000 次/秒 时,Redis 开始落后于 Memcached ,并且 延迟上升到 10 - 15 毫秒 。
相比之下,Memcached 在整个测试过程中保持稳定。
在网络上,你可能会看到 Memcached 的性能比 Redis 更强 ,但 延迟才是最关键的指标 。
更高的延迟意味着网页加载更慢,最终影响用户体验。
尽管 Redis 具有丰富的功能,但你真的需要它们吗?
Redis 集群难以扩展和维护 ,你可能需要不断添加 新的分片(shard) 并进行 重新平衡 。
通常,很多人一开始自己管理 Redis,但随着负载增加,他们会转向 Redis 集群 ,
经历几次 生产事故 后,最终可能会选择 昂贵的托管 Redis(AWS 或其他云服务)。
相比之下,Memcached 非常容易运行 ,如果你 只是想缓存 SQL 查询 以加速数据库,Memcached 是一个不错的选择。
测试结果
在 CPU 资源耗尽之前:
- Redis 最高处理能力:94,000 请求/秒
- Memcached 最高处理能力:112,000 请求/秒
但 最重要的还是延迟 。
根据本次测试结果,你可以自己决定:
- 是选择简单、低延迟的 Memcached
- 还是选择功能强大的 Redis

请记住,维护 Redis 集群非常困难 ,很多公司甚至专门雇人 只负责维持 Redis 的正常运行。
现在,我们查看整个测试期间的各项指标:
- 每秒操作数(Operations per second)

- 在 50,000 ops/sec 时,Redis 和 Memcached 的性能开始出现差异
- 可以清楚地看到 每种缓存的最大处理能力
- SET(写入)操作的延迟

- 延迟差异 非常明显
- 在 Redis 过载时,延迟甚至接近 SQL 查询本身的延迟(35ms)
- 但在 CPU 使用率低于 15% 时,两者的延迟都很稳定且较低
- GET(读取)操作的延迟

- 趋势类似 ,但 GET 操作的平均时间约为 SET 操作的一半
- Redis 最高 GET 延迟约为 20ms
- CPU 使用率

- 两者表现几乎相同,在 CPU 满载前都能维持稳定
- 内存使用

- 两者模式稍有不同
- 网络使用

- 有一定的区别
总结
这些测试都使用的是 默认配置 。
如果你能优化 Redis 或 Memcached ,欢迎提交 PR(Pull Request) ,我会给予 署名,并分享如何改进性能。