最近工作中,系统压测遇到一个性能瓶颈问题,通过最终排查,发现应用接口中使用了大量的Hgetall命令从Redis中查询数据信息,导致Redis单实例OPS达到秒钟7W次,Redis服务器CPU使用率达到上限,遇到性能问题。

HGETALL key

起始版本:2.0.0

时间复杂度:O(N) where N is the size of the hash.

返回 key 指定的哈希集中所有的字段和值。返回值中,每个字段名的下一个是它的值,所以返回值的长度是哈希集大小的两倍

返回值

array-reply:哈希集中字段和值的列表。当 key 指定的哈希集不存在时返回空列表。

例子

redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HGETALL myhash
1) "field1"
2) "Hello"
3) "field2"
4) "World"
redis> 

通过官方文档,可以了解到命令HgetAll的时间复杂度为O(n)。这意味着Hash的field越多,当使用HgetAll获取全量数

据时,性能越差,该命令的性能与field字段的数量成正比。

遇到问题后,上网查询资料,解决方案大致两种:

1) 借助MemCached

2) 新增一个field字段,将原Redis key对应的所有数据信息全部存储在该filed中,然后使用Hmget命令代替HgetAll

但是以上两种方案,均存在各种弊端,并没有从根本上解决问题。找公司其他部门技术大拿交流,最终讨论出以下方案解决问题:

通过使用Redis dump命令获取到Redis序列化后的值,获取到的是字节数组。在应用中将该字节数组按照Redis协议自行解析成需要的HashMap数据。

方案优点:

1)  dump命令的时间复杂度为O(1),性能优于HgetAll

2)  将字节数组的解析由Redis服务器转移到了应用服务器,减轻了Redis 服务器CPU的运算压力

3)  充分利用了应用服务器的CPU,并且应用服务器方便扩容。

DUMP key

起始版本:2.6.0

时间复杂度:O(1) to access the key and additional O(N*M) to serialized it, where N is the number of Redis objects composing the value and M their average size. For small string values the time complexity is thus O(1)+O(1*M) where M is small, so simply O(1).

序列化给定 key ,并返回被序列化的值,使用 RESTORE 命令可以将这个值反序列化为 Redis 键。

序列化生成的值有以下几个特点:

  • 它带有 64 位的校验和,用于检测错误,RESTORE 在进行反序列化之前会先检查校验和。
  • 值的编码格式和 RDB 文件保持一致。
  • RDB 版本会被编码在序列化值当中,如果因为 Redis 的版本不同造成 RDB 格式不兼容,那么 Redis 会拒绝对这个值进行反序列化操作。

序列化的值不包括任何生存时间信息。

返回值

如果 key 不存在,那么返回 nil。</br> 否则,返回序列化之后的值。

例子

redis> SET mykey 10
OK
redis> DUMP mykey
"\u0000\xC0\n\u0006\u0000\xF8r?\xC5\xFB\xFB_("
redis> 

Redis命令之HGetAll性能问题解决方案相关推荐

  1. 关于Redis命令keys在性能方面的说明

    redis的keys命令类似于Mysql的like命令,无非就是模糊匹配相近的字符数据. KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 k ...

  2. Redis命令性能优化及事务使用过程

    场景 假设有这样一个使用场景,依次执行下面的5条命令 命令1:hset mall:sale:freq:ctrl:860000000000001 599055114591 1(hash结构,field表 ...

  3. redis命令之哈希表类型hgetall命令用法详情

    哈希表 HGETALL命令 命令:hgetall key,返回对应key的所有的域field和与之对应的value,当key不存在时返回empty list or set,而不是nil 127.0.0 ...

  4. Redis命令合集和设计场景

    目录 常规命令 String字符串类型 BIT位图 [使用bit命令实现签到功能] List有序链表 Hash哈希 Set无序集合 [使用无序集合统计用户的留存数] Sorted Set有序集合 [使 ...

  5. redis和mysql内存数据库性能_Redis高性能内存数据库

    (一)什么是Redis? Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zse ...

  6. 由浅入深解读Redis高级能力及性能调优

    摘要 本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和 ...

  7. redis将散裂中某个值自增_这些Redis命令你都掌握了没?

    本章主要内容 字符串命令.列表命令和集合命令散列命令和有序集合命令发布命令与订阅命令其他命令 本章将介绍一些没有在第1章和第2章出现过的Redis命令,学习这些命令有助于读者在已有示例的基础上构建更为 ...

  8. redis查询所有key命令_想在生产搞事情?那试试这些 Redis 命令

    作者:鸭血粉丝 出自:Java极客技术 原文:mp.weixin.qq.com/s/WeAamgYYGQfxlsppsn9_lg 哎,最近阿粉又双叒叕犯事了. 事情是这样的,前一段时间阿粉公司生产交易 ...

  9. redis命令大全参考手册

    redis功能强大,支持数据类型丰富,以下是redis操作命令大全,基本上涵盖了redis所有的命令. 你一定要知道的是:redis的key名要区分大小写,在redis中除了 和空格外,其他的字符都可 ...

最新文章

  1. HashMap的getOrDefault()方法
  2. SQL 性能不佳的几个原因
  3. 智能城市技术能够更好地改善日常生活
  4. 激活中国汽车媒体圈,杉车网与尾部汽车媒体的九死一生
  5. Java内存模型JMM
  6. qt在linux下编译资源文件,linux下Qt qrc文件的编写与应用
  7. springboot+vue汽车4S店车辆销售维修管理系统java源码
  8. 空间直角坐标系(xyz)与大地坐标系(经纬高)的转换
  9. python中timeout什么意思_Python爬虫(五)timeout以及retrying的使用
  10. RuntimeError: mat1 dim 1 must match mat2 dim 0 报错解决
  11. #二维差分# [ssloj 1467] U
  12. win10修改用户名_大神帮您win10系统用户文件夹改名的修复方法
  13. 统计APP下载量--发现安卓下载大文件使用多线程下载方式
  14. 麻将为什么是顶级随机设计?
  15. java json ajax数据处理,echart显示 问题待解决
  16. 服务器运营维护要多少钱,运营维护升级也需成本
  17. 【考研】计算机考研,我不建议考408
  18. 不会侧方停车?看看这6张图简单学会!
  19. 爱奇艺体育与巴塞罗那足球俱乐部达成合作;中国机械工业百强、汽车工业整车二十强公布 | 美通企业日报...
  20. 鸿蒙系统为国,华为发布鸿蒙系统,国人为之骄傲

热门文章

  1. 书评:由乍得·福勒撰写的《热情的程序员》
  2. 公历转农历、生肖、干支纪年、节气算法研究和C程序实现
  3. php 微信开发回复消息
  4. 2018-2020最新Google开源镜像站搜集来源开源中国
  5. JAVA 间隔 时间 计算器
  6. 初步探究Android App API接口测试--实战
  7. 第一节、linux中安装redis(一)
  8. 求助!matlab软件下SVM(支持向量机)做回归预测,软件版本为2016b看,老是报错看,不知道怎么解决这个问题。
  9. 单片机 c语言 p1控制流水灯,单片机控制的流水灯程序
  10. 【正点原子STM32连载】第六章 新建寄存器版本MDK工程 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1