hgetall的Redis的性能(表示使用欺骗的hgetall)
在功能、数据存储方法已用于缓存,但在Redis的更换,一个哈希数据存储和方便许多memcache,但是问题来了,一个列表的哈希如果金额不大的情况下,使用hgetall功能几乎没有问题,一旦更多超过50以上的hgetall功能列表,可以看到性能问题非常直观的不是数据分析。redis是单线程!当处理一个请求,其他请求只能等待。通常请求都被处理的很快,但是当我们使用hgetall,我们必须经历的每一个领域来获取数据,这是对CPU资源的消耗成正比和字段的数量。如果我们仍然使用流水线,那就更糟了。
复制代码代码如下所示:
性能= cpu /操作
也就是说,为了提高性能,或增加在运行过程中CPU的个数,或者减少在操作过程中操作数。为了继续使用哈希结构数据和解决这个问题,一个更方便的方法是存储散列在序列化字符串,和然后提取反序列化的数据,然后使用hget(关键,数组(哈希..))。
例如:
复制代码代码如下所示:
的…
arrkey美元=阵列('dbfba184bef630526a75f2cd073a6098 ','dbfba184bef630526a75f2cd0dswet98)
strkey美元=测试;
$ obj -> hget(strkey美元,美元arrkey);
原hgetall降低到hget,也就是说,不再需要在哈希遍历每个领域,所以即使不让更多的CPU参与运算,但明显减少操作的次数,这样的表现仍然是显著的;但缺点也很明显,和所有的冗余,这方案是浪费了很多的记忆。
有人会问,虽然没有遍历域的过程,但是它增加了反序列化的过程,反序列化的代价总是很高。它还能提高性能吗关键是在CPU上启动我们的字段遍历操作。后来,不管是什么语言,反序列化的操作都可以通过多进程或多线程来保证。它保证在多个CPU上完成,因此性能得到普遍提升。
此外,很多人直观地解决问题,通过运行Redis的多个实例。事实上,这可以增加在CPU处理操作的数量,有助于提高性能,但需要注意的是,hgetall流水往往使指数爆炸式的增长,过程中的操作数的对比,我们可以增加redis实例的数量是杯水车薪这方法不在这种情况下,完全解决问题。
请注意,hgetall redis。
世上没有坑,许多人倒在地上,就成坑了。
我听到有人说,Redis的hgetall是一个坑,但我不相信邪恶的:不管什么坑,我们必须加紧踩两脚停止。这不是一个好的倾听者黄河心不死,说难听点是不哭的。
开始运行很稳定,我想让所有的人都说hgetall坑是一个字:呸稳定!此时的我像温水里的青蛙一样,忘记了危险,在过去的一天时间,突然有一天需要改变,我要从十方面扩展哈希的超过100个字段的数据内容,而流水线获得数百hgetall结果使用。所以我跌入坑:服务器宕机。
那是为什么redis是单线程!当处理一个请求,其他请求只能等待。通常请求都被处理的很快,但是当我们使用hgetall,我们必须经历的每一个领域来获取数据,这是对CPU资源的消耗成正比和字段的数量。如果我们仍然使用流水线,那就更糟了。
如何解决这个问题请允许我给出一个合理的公式:
复制代码代码如下所示:
性能= cpu /操作
也就是说,为了提高性能,或者在操作过程中增加CPU的数量,或者减少操作过程中的操作数:
借助memcached
redis存储没有任何变化,另外,我们使用memcached来实现一套缓存存储原来需要在redis哈希,hgetall当然,因为memcached存储为一个字符串,所以当我们存储的哈希,实际上是经过序列化存储在字符串的哈希,当查询后可以将memcached客户端驱动程序,通常可以实现透明的序列化和反序列化的过程。这个方案的优点是,memcached支持多线程,这样可以让更多的CPU参与操作,因为没有遍历每个领域,所以相应的操作会降低;当然,也有很多缺点,因为一个新的缓存层介绍,所以浪费内存,提高有限的复杂性,此外,即使有时我们只需要几场的数据,也要完成数据的查询,然后筛选,这无疑浪费带宽。当然,我们可以查询redis直接在这种情况下,但毫无疑问的是,有些复杂了。
顺便说一句,memcached支持Multiget,可以达到的效果类似于流水线作业,但你必须对基坑memcached,非常小心,mulitiget深不可测的问题。
序列化字段冗余
当redis存储散列,它存储一个名为所有。它的内容是原始散列数据的序列化。在查询时,只要hget是多余的,那么它是可序列化的。该方案具有的序列化字段冗余的优势,我们把原来的hgetall操作简化为hget,也就是说,不再需要在哈希遍历每个领域,所以即使不让更多的CPU参与运算,但明显减少操作的次数,所以性能的提升仍然是显著的;当然缺点也很明显,和冗余,这浪费了大量的存储方案。
有人会问,虽然没有遍历域的过程,但是它增加了反序列化的过程,反序列化的代价总是很高。它还能提高性能吗关键是在CPU上启动我们的字段遍历操作。后来,不管是什么语言,反序列化的操作都可以通过多进程或多线程来保证。它保证在多个CPU上完成,因此性能得到普遍提升。
…
此外,很多人直观地解决问题,通过运行Redis的多个实例。事实上,这可以增加在CPU处理操作的数量,有助于提高性能,但需要注意的是,hgetall流水往往使指数爆炸式的增长,过程中的操作数的对比,我们可以增加redis实例的数量是杯水车薪这方法不在这种情况下,完全解决问题。
…
一个坑是用来踩它的。当然,如果你能爬出来的话,不要害怕进去!