Redis不同版本性能研究
Redis不同版本性能研究
背景
前期同事遇到了一个大key的慢查询.
前提条件是: 一个 60万key的环境里面.
有一个 260万元素的set类型的key
产品经常会进行 smember key 的操作
出现了长达1.5秒的 slowlog.
同期还出现了内存飙涨与实际内存使用不符的情况.
所以想着研究一下内存.
发现新问题
当时与同事一起看时 记得 slowlog 是 1.5秒左右
因为我手头上刚好有一个 redis6.2.6 的飞腾ARM版本的环境,就直接拿来用了.
当时只是定位到了问题,所以每天关注.
早上起来,我突发奇想,是不是smember 导致内存上升, 然后就在ARM的环境里面执行了相关的命令
发现slowlog:
slowlog get
1) 1) (integer) 18
2) (integer) 1703203780
3) (integer) 854102
4) 1) "SMEMBERS"
2) "ecp:counter:*
发现只有0.85秒左右的延迟 我感觉不太对, 理论上ARM会更慢才对? 为何会这样?
同期发现内存是没有啥变化的. 所以没有解决旧问题, 但是发现了新问题
Redis的版本信息为:
redis_version:6.2.8
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:1274cf00783b476
redis_mode:standalone
os:Linux 4.19.90-24.4.v2101.ky10.aarch64 aarch64
arch_bits:64
思考
Redis是单线程的
理论上他的延时只跟CPU的工作能力相关
理论上不应该出现如此大的差异. ARM 的延时只有 x86的一半
这个简直是不可理解的.
突然先到 客户现场使用的是redis 4.0.11 的版本.
然后进一步想到是不是版本性能差异?
想干就干一把
下载不同版本的redis
http://download.redis.io/releases/
redis-4.0.11.tar.gz 27-Jun-2020 15:51 1739656
redis-5.0.0.tar.gz 27-Jun-2020 15:51 1947721
# 发现发布时间不准. 尴尬
Redis 1.0 是 Redis 数据库的第一个正式版本,于2009年3月发布。
Redis 2.0 于2010年4月发布。Redis 2.0 引入了一些重要的新特性,如虚拟内存机制、实现 Redis 的 Lua 脚本语言、支持哈希类型的直接操作以及提供慢查询日志等功能
Redis 2.6 于2012年8月发布。Redis 2.6 引入了一些重要的新特性,如虚拟内存、持久化和内存优化等。
Redis 2.8 于2014年4月发布。Redis 2.8 引入了一些重要的新特性,如对 Lua 脚本、集群和二进制流支持的提升
Redis 3.0 于2015年4月发布。Redis 3.0 引入了一些重要的新特性,如更加高效和可靠的集群方案、更加安全和可靠的持久化机制,以及增强了对 Lua 脚本、哈希表和流数据的支持。
Redis 4.0 于2017年9月发布。Redis 4.0 引入了一些重要的新特性,如更加强大和高效的集群功能、更加安全和可靠的持久化机制、新的数据类型、事务和流水线批处理等功能。
Redis 5.0 于2018年10月发布。Redis 5.0 引入了一些重要的新特性,如更加强大和高效的模块化架构,更加安全和可靠的持久化机制、新的数据类型、多种集群模式、新增命令等等。
Redis 6.0 是 Redis 数据库的一个重要版本,于2020年4月发布, 支持了IO多线程
Redis 7.0 在2022年4月27日正式发布 它不仅包含了50多个新命令,还有大量核心新特性与改进
Redis 7.2 于2023年8月15日发布.
关于redis版本号的说明
Redis 使用标准版本标记进行版本控制:major.minor.patchlevel。
偶数的版本号表示稳定的版本, 例如 1.2,2.0,2.2,2.4,2.6,2.8。
奇数的版本号用来表示非标准版本,例如2.9.x是非稳定版本,它的稳定版本是3.0。
测试规划
计划编译 4.0.11 和 7.2.3 等版本进行验证.
导入dump文件, 执行smember 命令查看slowlog的结果信息
编译时间:
4.0.11
real 1m43.809s
user 1m39.276s
sys 0m6.801s
5.0.14
real 2m54.587s
user 2m49.529s
sys 0m9.701s
7.2.3
real 5m4.991s
user 4m55.361s
sys 0m16.131s
注意都是 飞腾S2500 的服务器
可以看到编译时间 4.0.11 100秒. 7.2.3 编译时间 304秒.
经过六年时间的发展, redis的代码量可能有了2-3倍的变化.
所以东西变重是很正常的.
时间差异
Redis 4.0.11
slowlog get
1) 1) (integer) 0
2) (integer) 1703205853
3) (integer) 1061550
4) 1) "smembers"
2) "ecp:counter:
列表完整展示时间: (124.69s)
used_memory:2176292832
used_memory_human:2.03G
used_memory_rss:2368798720
used_memory_rss_human:2.21G
dbsize
(integer) 648463
Redis 5.0.14
1) 1) (integer) 3
2) (integer) 1703208791
3) (integer) 1019090
4) 1) "SMEMBERS"
2) "ecp:counter:
used_memory:2175424280
used_memory_human:2.03G
used_memory_rss:2210332672
used_memory_rss_human:2.06G
dbsize
(integer) 648463
Redis 6.2.8
1) 1) (integer) 18
2) (integer) 1703203780
3) (integer) 854102
4) 1) "SMEMBERS"
2) "ecp:counter
列表完整展示时间: (112.00s)
内存使用情况:
used_memory:2175438112
used_memory_human:2.03G
used_memory_rss:2255749120
used_memory_rss_human:2.10G
dbsize
(integer) 648463
Redis 7.2.3
这个版本的dump文件数据格式发生了变化, 无法加载.
SMEMBERS ecp:counter
(empty array)
这一点非常坑.
used_memory:1584538448
used_memory_human:1.48G
used_memory_rss:1626537984
used_memory_rss_human:1.51G
used_memory_peak:1584791080
used_memory_peak_human:1.48G
dbsize
(integer) 648463
一个简单结论
1. Redis 6.2.8 导出的文件 4.0.11 无法加载,提示版本不对, 无法加载文件类型为 9的 内存文件.
2. Redis 6.2.8 和 redis 4.0.11 的dump文件时可以向前兼容的, 能够加载里面的大部分数据.
3. Redis 7.0.11 可以加载 4.0.11和 6.2.8 导出的dump文件, disize也是准确的, 但是缺少了部分数据
Set类型的key出现了数据丢失, 是一个不兼容升级.
4. 简单看到 Redis6.2.8 比 Redis 4.0.11 的最大时间有了一定的优化.
比较三次的slowlog的时间为:
redis 4.0.11 的三次平均时间: 1,059,415
redis 5.0.14 的三次平均时间: 1,023,054
redis 6.2.8 的三次平均时间: 842,629
发现redis的确随着版本的提升, 性能出现了一定程度的提高.
客户现场使用的是x86的redis 但是因为采用的是 K8S pod运行, 并且采用了 nfs存储.
我怀疑K8S容器化的损耗也比较大, 对性能的影响也比较多.
客户理论上应该是2020年左右的服务器, 理论上比 飞腾S2500至少要领先 5年.
所以现在推断 一方面是版本太低, 一方面是容器化损耗导致性能下降.
如果对性能要求比较高, 一方面使用高频CPU, 一方面使用更新的性能更好的版本, 一方面降低部署复杂度,让软件更接近于硬件
性能会更加好一些.
Redis不同版本性能研究的更多相关文章
- redis状态与性能监控
Redis介绍 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表.哈希.集合和有序集合5种.支持在服务器端计算集合 ...
- Redis 优化查询性能
一次使用 Redis 优化查询性能的实践 应用背景 有一个应用需要上传一组ID到服务器来查询这些ID所对应的数据,数据库中存储的数据量是7千万,每次上传的ID数量一般都是几百至上千数量级别. 以前 ...
- Redis各种数据结构性能数据对比和性能优化实践
很对不起大家,又是一篇乱序的文章,但是满满的干货,来源于实践,相信大家会有所收获.里面穿插一些感悟和生活故事,可以忽略不看.不过听大家普遍的反馈说这是其中最喜欢看的部分,好吧,就当学习之后轻松一下. ...
- 一次使用 Redis 优化查询性能的实践
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,一次使用 Redis 优化查询性能的实践 应用背景 有一个应用需要上传一组ID到 ...
- Ehcache/Redis/Tair缓存性能对比[转载]
FW : http://xulingbo.net/?p=434 版权归许令波所有.此处只是一个转载. 后面介绍的不同方式都有测试数据,这些测试数据都是在同一的测试环境下得出的测试结果: 测试机器的配置 ...
- Redis基础与性能调优
Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库.缓存服务或消息服务使用. Redis支持多种数据结构,包括字符串.哈希表.链表.集合.有序集合.位图.Hyperloglogs等. ...
- Redis 历史版本下载URL
Redis 历史版本下载URL: http://download.redis.io/releases/ Redis和RedisClient 官网下载方式: https://blog.51cto.com ...
- 使用Redis管道提升性能
首发于 樊浩柏科学院 Redis 的 管道 (pipelining)是用来打包多条无关命令批量执行,以减少多个命令分别执行带来的网络交互时间.在一些批量操作数据的场景,使用管道可以显著提升 Redis ...
- Redis 常见的性能问题都有哪些?如何解决?
Redis 常见的性能问题都有哪些?如何解决? Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最 ...
- 线上Redis高并发性能调优实践
项目背景 最近,做一个按优先级和时间先后排队的需求.用 Redis 的 sorted set 做排队队列. 主要使用的 Redis 命令有, zadd, zcount, zscore, zrange ...
随机推荐
- DDD落地实践-架构师眼中的餐厅 | 京东云技术团队
本文以餐厅场景为叙事主线,以领域驱动为核心思想,结合架构设计与功能设计方法论.是从领域分析到落地的全过程案例,内容偏重于落地,因此不乏一些探讨,欢迎指正. 文章较长.全程干货.耐心读完.必有收获. 本 ...
- 自签证书https
1.下载编译好的openssl. http://slproweb.com/products/Win32OpenSSL.html 下载完成后运行安装: 记住你安装到的目录,等下打开这个文件夹(小贴士:最 ...
- C# 添加OLE到PPT幻灯片
本文介绍通过C#程序代码来添加OLE对象到PPT幻灯片的方法.这里以将Excel文档为对象插入到PPT幻灯片中的指定位置:添加时,将Excel中的单元格范围保存为图片,将图片以嵌入的方式添加到幻灯片, ...
- C++篇:第十章_命名空间_知识点大全
C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 十.命名空间 命名空间可以在全局作用域或其他命名空间内部定义,但不能在函数.结构 ...
- GaussDB(DWS)案例丨MERGE场景下语句不下推引起的性能瓶颈问题
本文分享自华为云社区<GaussDB(DWS)性能调优:MERGE场景下语句不下推引起的性能瓶颈问题案例>,作者:O泡果奶~. 1.[问题描述] 语句执行时间过长,且该语句performa ...
- 云图说 | 通过Helm模板快速部署中间件应用
摘要:通过全容器化Helm模板,快速部署中间件应用. 云容器引擎基于Kubernetes Helm标准的模板提供统一的资源管理与调度,高效地实现了模板的快速部署与后期管理,大幅简化了Kubernete ...
- 高性能利器!华为云MRS ClickHouse重磅推出!
摘要:华为智能数据湖MRS服务即将上线ClickHouse高性能引擎集群,用户只需要几分钟,就可以轻松方便地一键式完成集群部署搭建,快速拥有PB级数据的秒级交互查询分析能力,帮助用户带来极致的性能体验 ...
- 什么是VXLAN?为什么需要VXLAN?
摘要:本文介绍了什么是VXLAN,以及VXLAN的基本概念和工作原理,包括:为什么需要VXLAN?VXLAN与VLAN之间有啥不同?什么是VTEP?什么是VNI?VXLAN报文是如何封装的?VXLAN ...
- 实践GoF的设计模式:单例模式
摘要:单例模式虽然简单易用,但也是最容易被滥用的设计模式.它并不是"银弹",在实际使用时,还需根据具体的业务场景谨慎使用. 本文分享自华为云社区<[Go实现]实践GoF的23 ...
- 解析WeNet云端推理部署代码
摘要:WeNet是一款开源端到端ASR工具包,它与ESPnet等开源语音项目相比,最大的优势在于提供了从训练到部署的一整套工具链,使ASR服务的工业落地更加简单. 本文分享自华为云社区<WeNe ...