首页 > 数据库 >Redis不同版本性能研究

Redis不同版本性能研究

时间:2023-12-22 10:12:04浏览次数:25  
标签:used 4.0 Redis 性能 redis 版本 memory integer

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, 一方面使用更新的性能更好的版本, 一方面降低部署复杂度,让软件更接近于硬件
性能会更加好一些. 

标签:used,4.0,Redis,性能,redis,版本,memory,integer
From: https://www.cnblogs.com/jinanxiaolaohu/p/17920675.html

相关文章

  • Go 语言实现高性能分布式锁
    Go语言实现高性能分布式锁原创 源自开发者 源自开发者 2023-12-2207:31 发表于广东 听全文源自开发者专注于提供关于Go语言的实用教程、案例分析、最新趋势,以及云原生技术的深度解析和实践经验分享。49篇原创内容公众号在分布式系统中,实现跨不同......
  • Redis“垃圾”过期死键管理与优化
    【作者】付磊Redis死键的定义不尽相同,通常有两种:写到Redis里后,由于过期时间过长或者压根没有过期时间,加之长期不访问,这类key可以被称为死键。明明已经过了过期时间,但还占用Redis内存(没有真的删除),这类key也可以被称为死键。注:本文讨论第二种情况一、两个例子下面两个列子中的键值均......
  • 国产DeepSeek Coder 33B开源:创新代码AI,性能优于CodeLlama
    引言近日,国产AI领域迎来了一项重大突破:DeepSeek团队正式发布了DeepSeekCoder33B模型,这一基于最新人工智能技术的代码生成模型不仅完全开源,而且在多项评测中显示出优于同类产品CodeLlama的卓越性能。Huggingface模型下载:https://huggingface.co/deepseek-aiAI快站模型免费加速下......
  • 性能测试流程与设计
    性能测试流程 性能测试准备 测试分析与设计 性能测试环境搭建 ......
  • 分布式缓存NewLife.Redis
    NewLife.Redis 是一个Redis客户端组件,以高性能处理大数据实时计算为目标。Redis协议基础实现位于Redis/RedisClient,FullRedis为扩展实现,主要增加列表结构、哈希结构、队列等高级功能。源码: https://github.com/NewLifeX/NewLife.RedisNuget:NewLife.Redis/NewLife.Extens......
  • 性能测试指标分析
    一、性能测试规划 并发用户数 并发用户数类型划分 吞吐量 点击率 相应时间 资源利用率 ......
  • ​CentOS7一键脚本安装docker并创建ES集群(docker版本)
    CentOS7一键脚本安装docker并创建ES集群(docker版本)说明:1、脚本中修改了默认的docker的存储路径为/data/docker2、脚本中修改了docker默认的网段为10.112.0.1/243、脚本中拉取镜像并安装portainer容器Web管理工具#!/bin/bashsed-i's/enforcing/disabled/g'/etc/selinux/confi......
  • 性能测试基础
    软件八大质量特征 什么是性能测试:性能测试:属于软件测试范畴,旨在测试处于特点环境和配置下的系统在一定量的负荷下,系统的正确性、相应时间、速度TPS、成功率、稳定性、可恢复性等特性是否满足特性干系人需求的能力。系统性能关于用户的体验。性能属于产品的非功能质量特性。......
  • docker初步入门学习安装redis和mysql
    dockerrun--namemyredis-p6379:6379-dredisredis-server--appendonlyyesdockerrun--namemysql-eMYSQL_ROOT_PASSWORD=123456-d-p3306:3306mysql:5.7.27dockerpullmysql:5.7.27dockerrun-d--hostnamemy-rabbit--namemyra......
  • dremio 24.3 版本构建的一些问题
    dremio24.3社区版代码提供了,从官方文档来看,构建与以前不太一样了,以下是构建中一些问题说明主要问题jdk需要同时包含jdk8以及jdk11,maven配置toolchains解决方法对于多jdk的安装可以使用二进制程序,比如我使用的mac我使用了sdkman这个工具管理多jdktoolchains配置......