业务行使用哈希对象将数据存储在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