HZ 参数解释
通过修改hz参数的值,您可以调整Redis执行定期任务的频率,从而改变Redis清除过期key、清理超时连接的效率。
Redis定期任务与hz参数的关系
为了定期检测资源和服务状态并根据预定策略执行相应的操作,Redis调用一个内部函数来执行多种后台任务,例如:
- 计算LRU信息并清除过期key。
- 关闭超时的客户端连接。
- 整理hash类型的数据。
- 执行RDB或AOF持久化相关操作。
- 更新统计信息。
这些定期任务是Redis服务正常运行的保障,它们的执行频率由hz参数的值指定,默认为10,即每秒执行10次。
典型应用场景
Redis会通过执行定期任务来主动清除过期key,执行过程如下:
- 从设置了过期时间的key的集合中随机检查20个key。
- 删除检查中发现的所有过期key。
- 如果检查结果中25%以上的key已过期,则开始新一轮任务。
如果过期key数量很多或者增加速度很快,而Redis的主动清除频率较低,过期key将占用大量的内存空间,可能会影响Redis服务的性能。适当调整hz参数的值,提高清除频率,能够很好地解决这个问题。
取值范围及设置建议
hz的取值范围为1~500。增大hz参数的值会提升各项定期任务的执行频率,但也会提高Redis服务的CPU使用率。默认值10在一般情况下已经可以满足需求,如果业务场景对于某些定期任务的执行频率有很高的要求,您可以尝试在100以内调整参数值。将hz的值增加到100以上对CPU使用率有相对较大的影响,请谨慎操作。
定期任务的执行频率【HZ】为一个固定值时,容易产生以下问题:
- 如果该值过小,在超时的客户端连接数较多或过期key较多等情况下,资源无法被及时整理回收,可能影响Redis服务的性能甚至导致服务崩溃。
- 如果该值过大,定期任务将会消耗过多的CPU资源,同样可能影响Redis服务的稳定性
调整redis的HZ的脚本命令
#/bin/bash
redis_addr_str="****:6379,****:6380"
redis_addr_array=(${redis_addr_str//,/ })
for redis_addr_info in ${redis_addr_array[@]}
do
redis_addr=(${redis_addr_info//:/ })
addr=${redis_addr[0]}
port=${redis_addr[1]}
# 修改redis 的hz参数
echo `redis-cli -h $addr -p $port config set hz 30`
# 将服务器当前所使用的配置记录到 redis.conf 文件中
echo `redis-cli -h $addr -p $port CONFIG REWRITE`
# 获取当前HZ
echo `redis-cli -h $addr -p $port config get hz`
done
通过线上实战,可以看到修改hz为30之后,效果明显