性能比拼: 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),我会给予 署名,并分享如何改进性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/77437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P1331 洛谷 海战

题目描述 思路 这个题需要读懂题意,即“什么样的形式表示两只船相撞?” ----> 上下相邻或左右相邻 如果图是不和法的,一定存在如下结构: # # . # 或 # # # . 或 # . # # 或 . # # #即四个格子里有三个#,一个"…

传统项目纯前端实现导出excel之xlsx.bundle.js

传统项目纯前端实现导出excel之xlsx.js 自从vue问世后,使得前端开发更加简洁从容,极大的丰富组件样式和页面渲染效果,使得前端功能的可扩展性得到极大地加强。虽然vue的使用对于前后端分离的项目对于功能实现与扩展有了质的飞跃,但…

2025.04.10-拼多多春招笔试第四题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 04. 优惠券最优分配问题 问题描述 LYA是一家电商平台的运营经理,负责促销活动的策划。现在平台上有 n n n

基于 Spring Boot 瑞吉外卖系统开发(三)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;三&#xff09; 分类列表 静态页面 实现功能所需要的接口 定义Mapper接口 Mapper public interface CategoryMapper extends BaseMapper<Category> {}定义Service接口 public interface CategoryService extends ISe…

FlinkSQL的常用语言

FlinkSQL 常用语言指南 FlinkSQL 是 Apache Flink 提供的 SQL 接口&#xff0c;允许用户使用标准 SQL 或扩展的 SQL 语法来处理流式和批式数据。以下是 FlinkSQL 的常用语言元素和操作&#xff1a; 基本查询 -- 选择查询 SELECT * FROM table_name;-- 带条件的查询 SELECT c…

spring mvc异步请求 sse 大文件下载 断点续传下载Range

学习连接 异步Servlet3.0 Spring Boot 处理异步请求&#xff08;DeferredResult 基础案例、DeferredResult 超时案例、DeferredResult 扩展案例、DeferredResult 方法汇总&#xff09; spring.io mvc Asynchronous Requests 官网文档 spring.io webflux&webclient官网文…

一问看懂——支持向量机SVM(Support Vector Machine)

目录 芜湖~~~支持向量机&#xff08;SVM&#xff09; 1. 引言 2. 基本思想 3. 数学模型 3.1 超平面定义 3.2 分类间隔与目标函数 3.3 软间隔与松弛变量 4. 核函数方法&#xff08;Kernel Trick&#xff09; 4.1 核函数定义 4.2 常用核函数 5. SVM 的几种类型 6. SV…

蓝桥杯 拼数(字符串大小比较)

题目描述 设有 n 个正整数 a1​…an​&#xff0c;将它们联接成一排&#xff0c;相邻数字首尾相接&#xff0c;组成一个最大的整数。 输入格式 第一行有一个整数&#xff0c;表示数字个数 n。 第二行有 n 个整数&#xff0c;表示给出的 n 个整数 ai​。 输出格式 一个正整…

Elasticsearch 系列专题 - 第三篇:搜索与查询

搜索是 Elasticsearch 的核心功能之一。本篇将介绍如何构建高效的查询、优化搜索结果,以及调整相关性评分,帮助你充分发挥 Elasticsearch 的搜索能力。 1. 基础查询 1.1 Match Query 与 Term Query 的区别 Match Query:用于全文搜索,会对查询词进行分词。 GET /my_index/_…

本地电脑使用sshuttle命令将网络流量代理到ssh连接的电脑去实现访问受限网络

本地电脑使用sshuttle命令将网络流量代理到ssh连接的电脑去实现访问受限网络 安装使用 工作过程中, 经常会遇到, 需要访问客户内网环境的问题, 一般都需要安转各式各样的VPN客户端到本地电脑上, 软件多了也会造成困扰, 所有, 找了一款还不错的命令工具去解决这个痛点 安装 官方…

双相机结合halcon的条码检测

以下是针对提供的C#代码的详细注释和解释&#xff0c;结合Halcon库的功能和代码结构进行说明&#xff1a; --- ### **代码整体结构** 该代码是一个基于Halcon库的条码扫描类GeneralBarcodeScan&#xff0c;支持单台或双台相机的条码检测&#xff0c;并通过回调接口返回结果。…

python基础语法12-迭代器与生成器

Python 生成器与迭代器详解 在 Python 中&#xff0c;生成器和迭代器是处理大量数据时的强大工具。它们能够帮助我们节省内存&#xff0c;避免一次性加载过多数据。生成器通过 yield 关键字实现&#xff0c;允许我们逐步产生数据&#xff0c;而迭代器通过实现特定的接口&#…

公司内部建立pypi源

有一篇建立apt源的文章在这里&#xff0c;需要的可以查看&#xff1a;公司内部建立apt源-CSDN博客 server: pip install pypiserver mkdir -d pypi/packages cp test.whl pypi/packages pypi-server run --port 8080 /home/xu/pypi/packages & 网页访问&#xff1a;http:…

VMware Workstation/Player 的详细安装使用指南

以下是 VMware Workstation/Player 的完整下载、安装指南&#xff0c;包含详细步骤、常见问题及解决方法&#xff0c;以及进阶使用技巧&#xff0c;适用于 Windows 和 macOS 用户。 VMware Workstation/Player 的详细安装使用指南—目录 一、下载与安装详细指南1. 系统要求2. 下…

蓝桥杯python组考前准备

1.保留k位小数 round(10/3, 2) # 第二个参数表示保留几位小数 2.输入代替方案&#xff08;加速读取&#xff09; import sys n int(sys.stdin.readline()) # 读取整数&#xff08;不加int就是字符串&#xff09; a, b map(int, sys.stdin.readline().split()) # 一行读取多个…

【JSON2WEB】16 login.html 登录密码加密传输

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

计算机网络起源

互联网的起源和发展是一个充满创新、突破和变革的历程&#xff0c;从20世纪60年代到1989年&#xff0c;这段时期为互联网的诞生和普及奠定了坚实的基础。让我们详细回顾这一段激动人心的历史。 计算机的发展与ARPANET的建立&#xff08;20世纪60年代&#xff09; 互联网的诞生…

洛谷P1824进击的奶牛简单二分

题目如下 代码如下 谢谢观看

如何建立高效的会议机制

建立高效的会议机制需做到&#xff1a;明确会议目标、制定并提前分发议程、控制会议时长、确保有效沟通与反馈、及时跟进执行情况。其中&#xff0c;明确会议目标是核心关键&#xff0c;它直接决定了会议的方向与效率。只有明确目标&#xff0c;会议才不会偏离初衷&#xff0c;…

开源AI大模型AI智能名片S2B2C商城小程序:科技浪潮下的商业新引擎

摘要&#xff1a; 本文聚焦于科技迅猛发展背景下&#xff0c;开源AI大模型、AI智能名片与S2B2C商城小程序的融合应用。通过分析元宇宙、人工智能、区块链、5G等前沿科技带来的商业变革&#xff0c;阐述开源AI大模型AI智能名片S2B2C商城小程序在整合资源、优化服务、提升用户体验…