性能比拼: Redis vs Memcached

本内容是对知名性能评测博主 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 实例来部署监控组件,同时运行客户端以模拟负载。


什么是缓存?

假设你有一个典型的 三层架构:

  1. 客户端层:可能是浏览器或移动应用
  2. 逻辑层:运行应用程序和业务逻辑
  3. 数据层:用于持久化存储数据

举个例子,假设你运营一个 电商网站 ,所有 用户数据 和 商品信息 都存储在 关系型数据库 中。每当客户登录账户时,你需要展示他们的 姓名、收货地址 以及其他详细信息。

这些数据并不会频繁变更,但每次请求时,仍然需要查询数据库。如果你的用户数量较少,这还可以接受,但如果有成千上万的用户,这些查询 会变得越来越慢。

解决方案是:
当用户登录时,查询数据库并将数据存储在缓存中(例如 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 的正常运行。

现在,我们查看整个测试期间的各项指标:

  1. 每秒操作数(Operations per second)
  • 在 50,000 ops/sec 时,Redis 和 Memcached 的性能开始出现差异
  • 可以清楚地看到 每种缓存的最大处理能力
  1. SET(写入)操作的延迟
  • 延迟差异 非常明显
  • 在 Redis 过载时,延迟甚至接近 SQL 查询本身的延迟(35ms)
  • 但在 CPU 使用率低于 15% 时,两者的延迟都很稳定且较低
  1. GET(读取)操作的延迟
  • 趋势类似 ,但 GET 操作的平均时间约为 SET 操作的一半
  • Redis 最高 GET 延迟约为 20ms
  1. CPU 使用率
  • 两者表现几乎相同,在 CPU 满载前都能维持稳定
  1. 内存使用
  • 两者模式稍有不同
  1. 网络使用
  • 有一定的区别

总结

这些测试都使用的是 默认配置 。

如果你能优化 Redis 或 Memcached ,欢迎提交 PR(Pull Request) ,我会给予 署名,并分享如何改进性能。

相关推荐
Json____4 分钟前
基于 Spring Boot + Vue3 的在线考试管理系统实战
java·spring boot·后端·it学习·wwwoop.com
Sam_Deep_Thinking18 分钟前
如何理解java的信号量
java·后端·面试·程序员
东风破_28 分钟前
NestJS 快速入门:先别背装饰器,把一条请求跑明白
后端
晴空蓝天31 分钟前
MDC traceId 全链路日志追踪:Spring Boot 3.5 里把日志串成一条线
java·spring boot·后端·python
明月_清风38 分钟前
干了 6 年前端,我是怎么一步步转型到 AI 的?
前端·后端·ai编程
顽疲43 分钟前
Java vue 养老系统源码详解:楼宇床位 care_space 与房态图 Spring Boot 实践
后端
Lyy1 小时前
DevOps平台 — 第十三篇:规划的设计与实现
后端·devops
今天不在线1 小时前
旧 Java 项目接入 AI 实战系列(一):四层递进,从基础对话到流式输出
后端
卷无止境1 小时前
WebGIS生态全景丨从浏览器里的地图到背后的空间数据库
后端·python
JuiceFS1 小时前
JuiceFS 企业版 5.4:从千亿文件到百万客户端
后端