redis的hGetAll函数的性能问题
在没关注这个函数之前,一直用的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函数的性能问题相关推荐
- php redis hgetall 慢,redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)
Redis是单线程的!当它处理一个请求时其他的请求只能等着.通常请求都会很快处理完,但是当我们使用HGETALL的时候,必须遍历每个字段来获取数据,这期间消耗的CPU资源和字段数成正比,如果还用了PI ...
- java hgetall_redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)
在没关注这个函数之前,一直用的Memcache的数据存储方式,但是自从更换了redis之后,对于一个hash的数据存与取 对于Memcache方便甚多,但是问题来了,一个hash的列表如果量不大的情况 ...
- redis session 超时时间_Shiro性能优化:解决Session频繁读写问题
点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 作者 | 张永恒 来源 | urlify.cn/YjEZNj 背景 Shiro 提供了强大的 Session 管理 ...
- 测试JavaScript函数的性能
在软件中,性能一直扮演着重要的角色.在Web应用中,性能变得更加重要,因为如果页面速度很慢的话,用户就会很容易转去访问我们的竞争对手的网站.作为专业的web开发人员,我们必须要考虑这个问题.有很多&q ...
- java面试(二十五)--(1)redis为什么读写速率快性能好(2)说说web.xml文件中可以配置哪些内容(3)和的区别(4)扑克牌顺子
1. redis为什么读写速率快性能好? 1.Redis将数据存储在内存上,避免了频繁的IO操作 2.Redis其本身采用字典的数据结构,时间复杂度为O(1),且其采用渐进式的扩容手段 3.Redis ...
- 面试:为什么redis是单线程的,性能却很高?
面试:为什么redis是单线程的,性能却很高? 1.数据全部存在内存中,在内存中读数据比磁盘中快的多 2.采用了非阻塞io,io多路复用技术 3.避免了线程切换的资源消耗
- php中include的作用,PHP 中关于 include() 函数的性能
简明现代魔法 -> PHP服务器脚本 -> PHP 中关于 include() 函数的性能 PHP 中关于 include() 函数的性能 2010-03-03 PHP程序员最常用的两个函 ...
- redis value多大会影响性能_redis面试总结
1. 使用Redis有哪些好处? (1)读写性能优异 (2)支持数据持久化,支持AOF和RDB两种持久化方式 (3)支持主从复制,主机会自动将数据同步到从机,可以进行读写分离. (4)数据结构丰富:除 ...
- redis value多大会影响性能_选择合适Redis数据结构,减少80%的内存占用
前言 redis作为目前最流行的nosql缓存数据库,凭借其优异的性能.丰富的数据结构已成为大部分场景下首选的缓存工具. 由于redis是一个纯内存的数据库,在存放大量数据时,内存的占用将会非常可观. ...
最新文章
- Python——eventlet.websocket
- 报名 | 大数据如何提升保险客户体验思享会
- 民营企业的项目,真的很难做
- c语言 2D-FFT(fft2)及IFFT
- 在一个TextArea中如何限制行数和字符数
- C# MD5加密解密帮助类
- 制作一个含生僻字的矢量字体文件(*.shx)
- 小米红米有锁机如何刷机升级MIUI12.5系统-完美解锁机刷机教程
- 截获HTTP/HTTPS请求实现头脑王者辅助
- c语言error函数的使用方法,IsError_Excel中iserror函数的使用方法
- background 渐变背景
- servlet常见错误
- 奈奎斯特与香农定理_这样解释奈奎斯特定理和香农定理,初学者也能明白
- i技术会 | 爱奇艺品牌广告算法探索和实践
- 区块链 技术 基本概念
- 硬盘开盘数据恢复-不能不学的硬盘基本知识
- 来世你还能和你的父母重逢吗?
- python win10 桌面_利用Python批量提取Win10锁屏壁纸实战教程
- 15必须掌握的win7快捷键
- 实验7-4 身份证号码最后一位