性能比拼: Redis vs Memcached

本内容是对知名性能评测博主 Anton Putra Redis vs Memcached Performance Benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准

在本视频中,我们将对比 RedisMemcached 。我会介绍一些功能上的不同,但主要关注 性能

首先,我们会衡量缓存系统最重要的指标之一---延迟(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) ,我会给予 署名,并分享如何改进性能。

相关推荐
来自星星的坤1 小时前
SpringBoot 与 Vue3 实现前后端互联全解析
后端·ajax·前端框架·vue·springboot
AUGENSTERN_dc1 小时前
RaabitMQ 快速入门
java·后端·rabbitmq
烛阴2 小时前
零基础必看!Express 项目 .env 配置,开发、测试、生产环境轻松搞定!
javascript·后端·express
燃星cro2 小时前
参照Spring Boot后端框架实现序列化工具类
java·spring boot·后端
追逐时光者5 小时前
C#/.NET/.NET Core拾遗补漏合集(25年4月更新)
后端·.net
FG.5 小时前
GO语言入门
开发语言·后端·golang
转转技术团队5 小时前
加Log就卡?不加Log就瞎?”——这个插件治好了我的精神
java·后端
谦行6 小时前
前端视角 Java Web 入门手册 5.5:真实世界 Web 开发——控制反转与 @Autowired
java·后端
uhakadotcom6 小时前
PyTorch 2.0:最全入门指南,轻松理解新特性和实用案例
后端·面试·github
bnnnnnnnn6 小时前
前端实现多服务器文件 自动同步宝塔定时任务 + 同步工具 + 企业微信告警(实战详解)
前端·javascript·后端