在没关注这个函数之前,一直用的Memcache的数据存储方式,但是自从更换了redis之后,对于一个hash的数据存与取 对于Memcache方便甚多,但是问题来了,一个hash的列表如果量不大的情况,用hGetAll函数几乎看不出问题,一旦这个列表超过50或者更多时,此时用hGetAll函数便能很直观的看到性能问题,这里就不作数据分析了。

Redis是单线程的!当它处理一个请求时其他的请求只能等着。通常请求都会很快处理完,但是当我们使用HGETALL的时候,必须遍历每个字段来获取数据,这期间消耗的CPU资源和字段数成正比,如果还用了PIPELINING,无疑更是雪上加霜。

PERFORMANCE = CPUs / OPERATIONs

也就是说,此场景下为了提升性能,要么增加运算过程中的CPU数量;要么降低运算过程中的操作数量。在为了继续使用hash结构的数据,又要解决此问题,比较方便的方法就是将hash以序列化字符串存储,取的时候先取出反序列化的数据,再用hGet(key,array(hash..))。

例如:

....
$arrKey = array('dbfba184bef630526a75f2cd073a6098','dbfba184bef630526a75f2cd0dswet98')
$strKey = 'test';
$obj->hGet($strKey,$arrKey);

把原本的hGetAll操作简化为hGet,也就是说,不再需要遍历hash中的每一个字段,因此即便不能让多个CPU参与运算,但是却大幅降低了操作数量,所以性能的提升仍然是显著的;当然劣势也很明显,和所有的冗余方式一样,此方案浪费了大量的内存。

有人会问,这样虽然没有了遍历字段的过程,但是却增加了反序列化的过程,而反序列化的成本往往也是很高的,难道这样也能提升性能?问题的关键在于开始我们遍历字段的操作是在一个cpu上完成的,后来反序列化的操作,不管是什么语言,都可以通过多进程或多线程来保证是在多个cpu上完成的,所以性能总体上是提升的。

另外,很多人直觉是通过运行redis多实例来解决问题。确实,这样可以增加运算过程中的CPU数量,有助于提升性能,但是需要注意的是,hGetAll和PIPELINING往往会让运算过程中的操作数量呈几何级爆炸式增长,相比之下,我们能增加的redis多实例数量简直就是杯水车薪,所以本例中这种方法不能彻底解决问题。

redis的hGetAll函数的性能问题相关推荐

  1. php redis hgetall 慢,redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)

    Redis是单线程的!当它处理一个请求时其他的请求只能等着.通常请求都会很快处理完,但是当我们使用HGETALL的时候,必须遍历每个字段来获取数据,这期间消耗的CPU资源和字段数成正比,如果还用了PI ...

  2. java hgetall_redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)

    在没关注这个函数之前,一直用的Memcache的数据存储方式,但是自从更换了redis之后,对于一个hash的数据存与取 对于Memcache方便甚多,但是问题来了,一个hash的列表如果量不大的情况 ...

  3. redis session 超时时间_Shiro性能优化:解决Session频繁读写问题

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 作者 |  张永恒 来源 |  urlify.cn/YjEZNj 背景 Shiro 提供了强大的 Session 管理 ...

  4. 测试JavaScript函数的性能

    在软件中,性能一直扮演着重要的角色.在Web应用中,性能变得更加重要,因为如果页面速度很慢的话,用户就会很容易转去访问我们的竞争对手的网站.作为专业的web开发人员,我们必须要考虑这个问题.有很多&q ...

  5. java面试(二十五)--(1)redis为什么读写速率快性能好(2)说说web.xml文件中可以配置哪些内容(3)和的区别(4)扑克牌顺子

    1. redis为什么读写速率快性能好? 1.Redis将数据存储在内存上,避免了频繁的IO操作 2.Redis其本身采用字典的数据结构,时间复杂度为O(1),且其采用渐进式的扩容手段 3.Redis ...

  6. 面试:为什么redis是单线程的,性能却很高?

    面试:为什么redis是单线程的,性能却很高? 1.数据全部存在内存中,在内存中读数据比磁盘中快的多 2.采用了非阻塞io,io多路复用技术 3.避免了线程切换的资源消耗

  7. php中include的作用,PHP 中关于 include() 函数的性能

    简明现代魔法 -> PHP服务器脚本 -> PHP 中关于 include() 函数的性能 PHP 中关于 include() 函数的性能 2010-03-03 PHP程序员最常用的两个函 ...

  8. redis value多大会影响性能_redis面试总结

    1. 使用Redis有哪些好处? (1)读写性能优异 (2)支持数据持久化,支持AOF和RDB两种持久化方式 (3)支持主从复制,主机会自动将数据同步到从机,可以进行读写分离. (4)数据结构丰富:除 ...

  9. redis value多大会影响性能_选择合适Redis数据结构,减少80%的内存占用

    前言 redis作为目前最流行的nosql缓存数据库,凭借其优异的性能.丰富的数据结构已成为大部分场景下首选的缓存工具. 由于redis是一个纯内存的数据库,在存放大量数据时,内存的占用将会非常可观. ...

最新文章

  1. Python——eventlet.websocket
  2. 报名 | 大数据如何提升保险客户体验思享会
  3. 民营企业的项目,真的很难做
  4. c语言 2D-FFT(fft2)及IFFT
  5. 在一个TextArea中如何限制行数和字符数
  6. C# MD5加密解密帮助类
  7. 制作一个含生僻字的矢量字体文件(*.shx)
  8. 小米红米有锁机如何刷机升级MIUI12.5系统-完美解锁机刷机教程
  9. 截获HTTP/HTTPS请求实现头脑王者辅助
  10. c语言error函数的使用方法,IsError_Excel中iserror函数的使用方法
  11. background 渐变背景
  12. servlet常见错误
  13. 奈奎斯特与香农定理_这样解释奈奎斯特定理和香农定理,初学者也能明白
  14. i技术会 | 爱奇艺品牌广告算法探索和实践
  15. 区块链 技术 基本概念
  16. 硬盘开盘数据恢复-不能不学的硬盘基本知识
  17. 来世你还能和你的父母重逢吗?
  18. python win10 桌面_利用Python批量提取Win10锁屏壁纸实战教程
  19. 15必须掌握的win7快捷键
  20. 实验7-4 身份证号码最后一位

热门文章

  1. 推荐 | 《社交红利2:0》:即时引爆的四个关键定律
  2. PMCAFF | 蓝港研发总监:游戏产品如何进行数据分析?内附核心数据分析实例子
  3. 【互联网今日大事儿】陌陌今日上市马云变亚洲首富!
  4. JavaScript之手写Promise
  5. bootstrap的滚动监听
  6. IOT/智能设备日志解决方案(1):概述
  7. Docker 监控 之普罗米修斯--架构篇
  8. 索引的优点,索引优化原则
  9. Cannot find module -----Node.js编程的第一个问题
  10. 我们来谈谈面向指针编程的那些事