当前位置: 首页 > 网络应用技术

REDIS命令HSCAN步骤在PIT指南上

时间:2023-03-07 22:46:53 网络应用技术

  业务行使用哈希对象将数据存储在REDIS中,并使用HSCAN命令来循环哈希对象中的所有元素。申请要求REDIS的响应时间也大大增加了业务异常。

  REDIS实例CPU使用率监视:

  REDIS实例QPS监视:

  第二,问题分析

  是时候通过REDIS的缓慢日志和REDIS命令进行监视,我们快速将“罪魁祸首”定位在更高的使用Redis实例CPU.STILL这么长时间的情况下?

  以下说明可以通过官方文件找到:

  选择其中之一进行分析:

  ````

  ``10“ 3072”`````````````````````````````````````````````````````````````````````````````````````````当哈希对象的元素小于hash-max-ziplist-entries(2048)或哈希对象的元素值较低时比Hash-max-ziplist-value(3072)使用Ziplist编码存储哈希对象,而编码类型的Ziplist Collection类型的HSCAN命令将忽略计数参数值并全额返回所有元素。在这种情况下,HSCAN的表现很差。

  以REDIS 5.0代码为例,使用HSCancommand函数来处理HSCAN命令,而ScangnericCommand函数的实际调用用于处理:

  '}````

  函数scangnericcommand的代码实现分为4个步骤:

  在遍历集合的第二步中,将相应地处理编码类型:

  功能scangnericcommand代码:

  longcursor){`

  '}````

  redis命令hgetall还完全返回所有元素,实现逻辑相对简单:

  intflags){`

  '}````

  对于哈希对象中所有元素的所有元素和价值的场景,hgetall和hscan是最佳性能吗?

  仿真创建一个包含2000个元素的哈希对象:

  10000`

  ````

  REDIS实例CPU使用率监视:

  REDIS实例QPS监视:

  压力测试服务器网络流量监视的监视:

  HGETALL和HSCAN的最高QP限于测试服务器的千兆网络卡限制,达到410。

  与10个复杂的压力测试结果相比,您可以找到:

  与20个并发测试结果相比,您可以找到:

  对于intset和ziplist的redis集合对象,HSCAN命令是忽略计数参数并穿越HSCAN命令执行中的所有元素。为了过滤一些元素,HSCAN命令可以在REDIS服务器上过滤,以减少应用程序服务器和REDIS服务器之间的网络带宽消耗。

  尽管这些参数可以控制各种编码REDIS,但REDIS收集对象的编码类型从Intset和Ziplist转换为Hshtable或Skiplist,以避免HSCAN命令设置对象的所有元素。建议调整此类参数设置仔细的问题,例如记忆使用量的上升。

  在实际的业务场景中,尝试避免使用HSCAN和HGETALL等命令,尤其是使用这些命令操作大型REDIS收集对象并以高频执行它。DATA压缩和其他方法来降低REDIS服务器上的压力。

  原始:https://juejin.cn/post/7094905227920277541