在没有关注此函数之前,我们使用的是Memcache的数据存储方式,但是更换redis后,在一个hash中存储和检索数据对Memcache来说非常方便。 但是,发生了问题。 如果一个hash的列表不大量,在hGetAll函数中几乎看不到问题。 当这个列表达到50以上时,就使用Hgetache
Redis是单线程的! 处理一个请求时,其他请求只能等待。 通常,请求会立即处理,但在使用HGETALL时,必须遍历每个字段以检索数据。 其间消耗的CPU资源与字段数量成比例。 如果还使用PIPELINING的话,会更加雪上加霜。
PERFORMANCE=CPUs/OPERATIONs也就是说,在此场景中,是否要增加运算中的CPU数量以提高性能? 是否减少运算中的操作数? 为了继续使用hash结构的数据,并解决此问题,将hash保存为序列化字符串,获取时取出反序列化的数据,然后使用hget(key,array ) hash . )非常有用。
例如:
. $ arr key=array (DBF ba 184 bef 630526 a 75 F2 CD 073 a 6098 )、) DBF ba 184 bef 630526 a 75 F2 CD0dsw et 98 ) $strKey=’test; $obj-hget($strkey,$arrKey ); 将原来的hGetAll操作简化为hGet。 也就是说,由于不需要遍历hash中的所有字段,所以即使不能让多个CPU参与运算,也可以大幅减少操作数量,因此性能的提高仍然很显著。 当然劣势也很明显,和所有冗馀方式一样,该方案浪费了大量的内存。
虽然不再有这种遍历字段的过程,但反序列化过程会增加,反序列化的成本也很高,但这样做会提高性能吗? 问题的关键是,遍历字段的操作现在只需要一个cpu。 然后,反序列化操作可以确保任何语言的多进程或多线程都在多个cpu上进行,从而提高整体性能。
此外,许多人直觉通过运行redis的多个实例来解决问题。 确实,这可以增加运算中的CPU数量,有助于提高性能。 但是需要注意的是,hGetAll和PIPELINING经常会使运算中的操作数呈几何爆炸式增长,而我们可以增加的redis多实例数却杯水车薪,因此在本例中该方法无法完全解决问题。
快三稳赚10大技巧化的数据,然后使用hget(key,array ) hash . )非常有用。
例如:
. $ arr key=array (DBF ba 184 bef 630526 a 75 F2 CD 073 a 6098 )、) DBF ba 184 bef 630526 a 75 F2 CD0dsw et 98 ) $strKey=’test; $obj-hget($strkey,$arrKey ); 将原来的hGetAll操作简化为hGet。 也就是说,由于不需要遍历hash中的所有字段,所以即使不能让多个CPU参与运算,也可以大幅减少操作数量,因此性能的提高仍然很显著。 当然劣势也很明显,和所有冗馀方式一样,该方案浪费了大量的内存。
虽然不再有这种遍历字段的过程,但反序列化过程会增加,反序列化的成本也很高,但这样做会提高性能吗? 问题的关键是,遍历字段的操作现在只需要一个cpu。 然后,反序列化操作可以确保任何语言的多进程或多线程都在多个cpu上进行,从而提高整体性能。
此外,许多人直觉通过运行redis的多个实例来解决问题。 确实,这可以增加运算中的CPU数量,有助于提高性能。 但是需要注意的是,hGetAll和PIPELINING经常会使运算中的操作数呈几何爆炸式增长,而我们可以增加的redis多实例数却杯水车薪,因此在本例中该方法无法完全解决问题。