Redis VS Memcached压力测试报告

2023-11-19

一.测试背景与目标

了解Redismemcached在高并发条件下的响应时间、吞吐量情况,以及对于服务器的压力情况(包括CPUIO、网络);考察目前的memcached存储timeline的方式的在高并发条件下的响应时间、吞吐量、负载情况,以及使用redis存储timeline的优势

二.测试环境

1.服务器

buzz090,刀片服务器

2.操作系统

CentOS release 5.5系统,内核版本:Linux version 2.6.18-194.el5

3.硬件

Intel(R) Xeon(R) CPU E5640 @ 2.67GHz 16CPU48G内存;千兆网卡

4.软件:

uRedis版本:2.6.0-rc52.5.11),主要为了以后测试lua script功能,部署三个节点,每个节点开2G内存,共6G。开启AOF,策略every second;关闭RDB;开启lru,策略:allkeys-lru

uMemcached版本:1.4.5. 部署三个节点,每个节点开2G内存,共6G

5.客户端

buzz097,硬件环境、操作系统和buzz090一致。

客户端和服务器使用内网互联。

三.测试工具

1.Redis客户端

jedis,版本号2.1.0. 池设置使用默认,未调优。超时时间为5s

2.Memcached客户端

xmemcached,版本号1.3.5,使用一致性hash,使用BinaryCommandFactory,使用failure mode,不过未配置备机(-_-.超时时间为5s

3.压力测试工具

海波写的压力测试框架(strike

四.测试方法

1.测试方法

分别以1002005001000个并发线程压力测试redismemcached的方法,运行时间为20-60分钟不等,每轮压力测试取样3000次,压力测试中观察如下参数:

u单次操作的响应时间

u3000次操作的响应时间(吞吐量)

uCPU情况

u网络rxtx

uIO

2.压力测试的方法

RedissetzaddevalSha

Memcachedset、(getscas的操作组合)

3.一些说明

对于读操作做了少量测试,发现性能与set操作类似,就不做单独的测试报告了。读操作重要的一点是:在redis中,对于一个很大的sorted set,使用zrange时一定要指定范围,否则将得到大量的错误

五.测试用例:

1.Redisset方法和memcachedset方法比较

u测试方法:使用java产生的伪随机数不断的对redis进行set操作,对memcachedset操作。

u测试结果:

Redis

100个线程下,单次操作时间为0-1ms;运行3000次的时间为80-95ms,即吞吐量为32000-38000CPU idle 96%IO wr_sec/s4000;网络rxKB/s3000txKb/s1500-2000

200个线程下,单次操作时间0-1ms;运行3000次的时间为87-105ms,即吞吐量为28500-34500CPU idle 96%IO wr_sec/s4000;网络rxKB/s3000txKb/s1500-2000

500个线程下,单次操作时间0-1ms;运行3000次的时间为95-110ms,即吞吐量为27000-31500CPU idle 96%IO wr_sec/s4000;网络rxKB/s3000txKb/s1500-2000

1000个线程下,单次操作时间0-1ms;运行3000次的时间为97-120ms,即吞吐量为25000-30000CPU idle 96%IO wr_sec/s4000;网络rxKB/s3000txKb/s1500-2000

Memcached

100200500个线程下,基本相差不大:单次操作时间;运行3000次的时间为65-85ms,即吞吐量为35000-46000CPU idle 97%IO wr_sec/s260-350;网络rxKB/s3000txKb/s3000

u小结

Memcached在小数据的写入方面性能要优于redis的,不仅吞吐量大,而且在服务器的负载、IO方面都有明显的优势。

Redis的关闭AOF后,性能大概上升了5%-10%,值得使用!

Redislru的时候感觉不到性能上的损耗

2.Rediszadd方法和memcachedgets cas方法组合的比较:

u背景:目前微博的timeline使用memcachedgets cas组合的方式,实现乐观锁,保证timeline的一致性。

u测试方法:为redis构建37sorted set,为memcached构建3700key,并发的写入。其中redis使用zadd方法;memcached比较复杂,模拟当前微博系统中timeline的写入方式:从memcachedgets,将结果数组做二分查找,插入新的timeline,在java虚拟机中做数组的移动、casmemcached中。

u测试结果

Redis

100个线程下,单次操作时间为0-1ms;运行3000次的时间为80-95ms,即吞吐量为32000-38000CPU idle 96%IO wr_sec/s5000;网络rxKB/s5000txKb/s2500

200个线程下,单次操作时间0-1ms;运行3000次的时间为87-105ms,即吞吐量为28500-34500CPU idle 96%IO wr_sec/s5000;网络rxKB/s5000txKb/s2500

500个线程下,单次操作时间0-1ms;运行3000次的时间为95-110ms,即吞吐量为27000-31500CPU idle 96%IO wr_sec/s5500;网络rxKB/s5000-6000txKb/s2500

1000个线程下,单次操作时间0-1ms;运行3000次的时间为97-120ms,即吞吐量为25000-30000CPU idle 96%IO wr_sec/s6000;网络rxKB/s6000txKb/s2500

Memcached

100个线程下:开始时单次写入时间以及3000次的写入时间均略优于redis,但是随着时间推移,一分钟后,3000次响应时间从80ms上升至250ms,五分钟后上升至400ms,十分钟后上升至600ms,二十分钟后接近800ms。单次响应时间也有类似的增长。

同时,网络rxKB/s100000txKb/s100000

u小结

Rediszadd方法在响应时间和吞吐量上与set方法基本无区别

当存储的数组很大时,memcached在网络性能、响应时间和吞吐量上均有较大程度的退步,而redis则无明显变化

对于timeline这样的数组的存储,redis更加适合!

3.Rediszadd方法和Redislua script方法的比较

u背景:微博中的timeline分为两类:固定长度,长度无限增长。对应于redis,长度无限增长对应于zadd方法;

固定长度可以是用lua script脚本实现,具体的脚本为:
Redis压力测试(二) - t_y_1 - t_y_1的博客

脚本中执行三次redis操作(zaddzcardzremrangebyrank),一次赋值、一次比较操作

Script在第一次时loadredis中,而后使用evalSha进行调用

u测试方法:分别构建37sorted set,不断的用这两个方法、使用不同的线程数来压力测试

u测试结果:

Zadd(见上)

Lua script

100个线程下:单次写入时间为2-5ms3000次响应时间为105-115ms,即吞吐量为26000-28500CPU idle 80%-90%IO wr_sec/s15000-22000;网络rxKB/s5000-6000txKb/s2500

200个线程下:单次写入时间为7-9ms3000次响应时间为112-120ms,即吞吐量为25000-27000CPU idle 80%-90%IO wr_sec/s15000-22000;网络rxKB/s5000-6000txKb/s2500

500个线程下:单次写入时间为12-21ms3000次响应时间为125-135ms,即吞吐量为22000-24000CPU idle 80%-90%IO wr_sec/s15000-22000;网络rxKB/s5000-6000txKb/s2500

1000个线程下:单次写入时间为30-40ms3000次响应时间为145-155ms,即吞吐量为19000-20500CPU idle 80%-90%IO wr_sec/s15000-22000;网络rxKB/s5000-6000txKb/s2500

如果每一次重新load script到服务器中,500个线程下:3000次响应时间为180-220ms,即吞吐量为13600-16600CPU idle 80%-90%IO wr_sec/s15000-22000;网络rxKB/s10000-12000txKb/s5000

u小结

以上lua脚本的性能大概是zadd70%-80%,但是在可接受的范围内,在生产环境可以使用。负载大概是zadd1.5-2倍,网络流量相差不大,IOzadd3倍(可能是开启了AOF,执行了三次操作?)

Lua一定要只load一次,然后循环使用,否则会有很大的性能缺失

Lua script所在的2.6.0-rc5版虽然不是stable版,官方网站也提到要在生产环境谨慎使用,但是测试下来没有发现bug

六.总结

1.Memcached在简单数据的写入上是有优势的,无论在响应时间、吞吐量、服务器的负载、IO、网络流量上都要优于redis

2.对于Timeline数组这样的数据,redis先天的类型丰富的优势可以极大的降低响应时间、提高吞吐量、提升服务器的性能指标。

3.Rediszaddset方法性能相差不大

4.Lua script可以实现在服务器端原子的执行多个操作的功能,性能大约是zadd70-80%(和脚本的复杂程度有关),但是肯定比将脚本拆开单次的请求redis要好

5.AOF的开启会带来很小的性能损失,值得尝试

6.Redis在执行lru的时候,性能损失基本可以忽略

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis VS Memcached压力测试报告 的相关文章

  • 多字段匹配查询

    我对弹性搜索相当陌生 想编写一个涉及两个字段的查询 我的意思是字段的内容包含指定的子字符串 我有一个包含字段的文档 如下所示 name n tag t 我试过这个 search d query match name n tag t 但查询结
  • 使用 Cassandra API 获取所有键——类似于“SELECT id FROM table;”

    Cassandra 命令行实用程序sstablekeys可用于从物理 SSTABLE 文件中提取所有定义的行键 sstablekeys cassandra data Keyspace1 Standard1 N Data db Cassand
  • 为什么我不能让单个 Redis 客户端在同一连接中充当 PUB 和 Sub ?

    我的思维模型是 聊天 我订阅了某个频道 并且可以向该频道发布消息 由于 pub sub 是异步的 因此发布的消息可能随时出现 包括当您期望命令响应时 尽管 Redis 是单线程的 通常会阻止此类事情 但网络延迟可能会导致一些有趣的影响 根据
  • CouchDB 和 Couchbase 有什么区别?

    之间有什么本质区别吗CouchDB http couchdb apache org and 沙发底座 http www couchbase com 我认为CouchDB和Couchbase Server之间有一些本质的区别需要指出 我不会写
  • CouchDB“加入”两个文档

    我有两个看起来有点像这样的文档 Doc id AAA creator id data DataKey id credits left 500 times used 0 data id AAA 我想要做的是创建一个视图 它允许我传递 Data
  • 当我的数据非规范化时(Firebase),如何按上次更新时间对我的聊天组进行排序?

    我正在使用 Firebase 和 AngularJS 构建一个聊天应用程序 并且我有一个与上的数据结构类似的数据结构此 Firebase 文档页面 https firebase google com docs database web st
  • Cassandra cli:将十六进制值转换为人类可读的格式

    我开始于卡桑德拉 questions tagged cassandra 当我跑步时list or get命令在cassandra cli questions tagged cassandra cli 我得到这样的结果 default use
  • 带有版本控制的 json 数据存储

    问题定义 有一个Java服务器存储JSON可以映射到 Java 类的数据 Java 类可能会发生变化 目标是能够更新 Java 类并且仍然能够解码JSON旧版本的数据到新版本的 Java 对象 应该有一个良好的版本控制系统 例如 能够向 J
  • 即席查询/更新是否开始影响您使用 MongoDB 的工作效率?

    我开发一个 ASP MVC 网站已经快一年了 现在完全在 mongodb 上 我大部分时间都喜欢它 使用 C mongodb 驱动程序和 mongovue 等工具 开发效率非常高 然而 我已经开始达到这样一个地步 有些事情我真的希望我有一个
  • Mongoose:find() 忽略重复值

    我有一只 聊天 猫鼬Schema它具有以下属性 const schema mongoose Schema recipient type mongoose Types ObjectId required true ref User sende
  • Firebase 数据库 - 编码错误

    我是 Firebase 的新手 我想使用他们的数据库 但编码似乎存在一些问题 这是我使用 UTF 8 编码的示例 json Stack This is madness Overflow 666 这就是当我将 json 导入 Firebase
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • 使用 Cassandra 进行单元版本控制

    我的应用程序使用 AbstractFactory 作为 DAO 层 因此一旦实现了 HBase DAO 系列 创建 Cassandra DAO 系列并从多个角度查看差异对我来说将是非常好的 不管怎样 试图做到这一点 我看到 Cassandr
  • 用于标签搜索的数据存储解决方案

    我已经按照预先计算的分数订购了数百万件商品 每个项目都有许多布尔属性 假设总共有大约一万个可能的属性 每个项目有十几个 我希望能够请求实时 几毫秒 给定任意属性组合的前 n 个项目 您会推荐什么解决方案 我正在寻找可扩展性极强的东西 我们目
  • MongoDB中批量FindAndModify的解决方案

    我的用例如下 我在 mongoDB 中有一组文档 我必须发送这些文档进行分析 文件格式如下 id ObjectId 517e769164702dacea7c40d8 日期 1359911127494 状态 可用 其他字段 我有一个阅读器进程
  • Firestore从集合中获取文档ID

    我正在尝试使用 id 检索我的文档 但无法弄清楚 目前我像这样检索我的文档 const racesCollection AngularFirestoreCollection
  • 如何在图数据库(如 Neo4j)中对现实世界的关系进行建模?

    我有一个关于在图形数据库中建模的一般性问题 但我似乎无法解决这个问题 您如何建模这种类型的关系 牛顿发明了微积分 In a 简单图 http docs neo4j org chunked snapshot graphdb neo4j rel
  • CAP 定理 - 可用性和分区容错性

    当我尝试理解CAP中的 可用性 A 和 分区容错性 P 时 我发现很难理解各种文章的解释 我感觉A和P可以在一起 我知道事实并非如此 这就是为什么我无法理解 简单解释一下 A和P是什么以及它们之间的区别 一致性意味着整个集群中的数据是相同的
  • 国外收藏的查找和排序

    所以我有一个收藏users 并且此集合中的每个文档以及其他属性都有另一个集合中文档的 id 数组 workouts 集合中的每个文档workouts有一个名为date 这就是我想要得到的 对于特定用户 我想要获取属于该用户的锻炼的 work
  • PHP 中的 MongoDB - 如何将项目插入集合中的数组中?

    这必须很容易 但我似乎无法弄清楚 假设我有一个集合users这是集合中的第一项 id ObjectId 4d8653c027d02a6437bc89ca name Oscar Godson email email protected cdn

随机推荐

  • ubuntu 硬盘操作

    查看移动硬盘的文件系统名 以及空间使用情况 df hl 查看硬盘的格式类型 以及挂载位置 df T 挂载硬盘 fdisk l 查看磁盘信息 mount o rw dev sdb1 home test 挂载硬盘 o 指定挂载文件系统时的选项
  • 单选框互斥且可同时取消选中

    单选框互斥且可同时取消选中 div class b div
  • 你值得拥有——流星雨下的告白(Python实现)

    目录 1 前言 2 霍金说移民外太空 3 浪漫的流星雨展示 4 Python代码 1 前言 我们先给个小故事 提一下大家兴趣 然后我给出论据 得出结论 最后再浪漫的流星雨表白代码奉上 还有我自创的一首诗 开始啦 2 霍金说移民外太空 霍金说
  • 最新版FreeRTOS的移植------STM32F103c8t6

    系列文章目录 用FlyMcu和USB转TTL给stm32中烧录程序 stm32C8 C6 文章目录 系列文章目录 前言 一 先决条件 二 使用步骤 1 获取FreeRTOS源码 2 将freeRTOS相关文件移植进keil工程 3 修改相关
  • 如何在ubuntu上安装gcc

    首先查一下 有没有gcc 如下 然后准备安装gcc 1 sudo是授权 apt是一个应用管理工具 apt是本地存了一份软件包信息的列表 包括依赖 大小 vesion等 目的是为了在安装软件的时候快速检测依赖 并自动安装相关依赖 但在安装之前
  • 数据库原理及应用(MySQL版)MySQL实验指导参考答案(实验一到实验八)

    点赞 收藏 慢慢看 lt 一 gt 实验一 CREATE DATABASE STUDENTSDB USE STUDENTSDB CREATE TABLE STUDENT INFO 学号 CHAR 4 NOT NULL PRIMARY KEY
  • 百度文库免费复制word文档的纯文字

    2022年5月11日测试过 以下方法能正常使用 1 在页面中安F12或者从浏览器的设置中找到开发人员工具 2 切换到控制台 然后点击右上角图标进入更多设置 3 在设置 首选项中 找到 调试程序 然后勾选 禁用javascript 4 做完上
  • 微信支付的收款功能被限制了怎么办,收款受限制怎么解除?

    使用小程序做电商 商城的微信支付的收款功能会遇到被限制的情况 直接影响用户下单后的付款操作 其实也不单单是小程序 商城APP中也会冒出类似的提示 遇到这种事情不要慌 根据具体的异常提示给出不同的解决方案 微信支付被限制的错误提示 我们列举两
  • 浅析数据库连接池(二)

    上一篇博客 主要是简单的介绍了普通数据库连接的过程以及耗费的资源 并且简单的谈了下连接池 这篇我们主要来看看数据库连接池的使用以及它最优的配置 总目录 1 数据库连接过程是怎样的 2 连接所占用的资源有哪些 3 连接池简介 4 连接池的使用
  • 用python画星空源代码

    from turtle import from random import random randint screen Screen width height 800 600 screen setup width height screen
  • 每天都在谈SOA和微服务,但你真的理解什么是服务吗?

    近几年来 我一直从事着和面向服务相关的底层软件研发工作 逐渐的形成了一些自己的看法 其中我觉得比较重要的看法就是服务需要一个更准确细致的定义 简单来说 服务的本质就是行为 业务活动 的抽象 为了更好的阐述新服务的概念 并方便与传统的SOA中
  • 【c语言】Hanoi塔问题

    一块板上有三根针 A B C A 针上套有 64 个大小不等的圆盘 大的在下 小的在上 如图 5 4 所示 要把这 64 个圆盘从 A 针移动 C 针上 每次只能移动一个圆盘 移动可以借 助 B 针进行 但在任何时候 任何针上的圆盘都必须保
  • 本周总结——勇敢尝试和体验

    人间烟火 生活趣事 快开学了 这一周都在写项目 键盘前一段时间坏掉了 当时买了保险 3年之内只换不修的 挺奇葩的 寄过去13天都没搭理我 也没说给换货 前几天忍不住打电话问了问 下午就发货了 昨天下午就领到了 看来有些东西还是需要主动问一问
  • 搞懂后序遍历!只需要这一篇

    讲讲对于后序遍历的理解 并通过题目加深理解 文章目录 核心 基础实现方式 104 二叉树的最大深度 111 二叉树的最小深度 222 完全二叉树的节点个数 110 平衡二叉树 101 对称二叉树 总结 核心 后序遍历的顺序为左右中 在一棵二
  • 在Ubuntu上安装Android-SDK的方法

    一 安装和配置Ubuntu系统 1 安装Ubuntu Desktop 14 04 x86 64 2 启用root账户 Ubuntu 14 04默认是不允许root账户登录的 在登录窗口只能看到普通用户和访客登录 在shell中运行以下命令即
  • 优化游标性能

    最好的改进光标性能的技术就是 能避免时就避免使用游标 摘自 Transact SQL权威指南 Ken Henderson 著 最好的改进光标性能的技术就是 能避免时就避免使用游标 SQL Server是关系数据库 其处理数据集比处理单行好得
  • ROS学习笔记(7):Navigation 导航

    目录 8 Navigation 8 1 Navigation工作框架 8 2 move base 8 3 Costmap 8 4 map server 8 5 AMCL 定位 8 Navigation Navigation是机器人最基本的功
  • 小程序显示富文本内容(wxparse)

    1 引入wxParse 下载地址https github com icindy wxParse 2 全局配置 3 获取富文本内容的js 加入如下内容
  • 在电力系统无功不足的情况下,为什么不宜采用调整变压器分头的办法来提高电压?

    在电力系统无功不足的情况下 为什么不宜采用调整变压器分头的办法来提高电压 答 当某一地区的电压由于变压器分头的改变而升高的时候 该地区所需的无功功率也增大了 这就可能扩大系统的无功缺额 从而导致整个系统的电压水平更加下降 从全局来看 这样做
  • Redis VS Memcached压力测试报告

    一 测试背景与目标 了解Redis和memcached在高并发条件下的响应时间 吞吐量情况 以及对于服务器的压力情况 包括CPU IO 网络 考察目前的memcached存储timeline的方式的在高并发条件下的响应时间 吞吐量 负载情况