Redisson RedisExecutor调用过多致CPU负载过高问题咨询
问题描述
- 运行环境:Java 1.8,Redisson客户端3.16.0版本
- 缓存TTL配置:
{ "cache1": { "ttl": 12000000 }, "cache2": { "ttl": 12000000 }, "cache3": { "ttl": 12000000 } }
尽管TTL设置为约6小时,但大量RedisExecutor调用导致CPU利用率过高。即使应用无流量,RedisExecutor仍每秒持续调用Redis执行大量缓存驱逐命令,相关日志片段:
1- RedisExecutor- connection released for command (EVAL) and params [if redis.call('setnx', KEYS[6] 2- RedisExecutor- acquired connection for command (EVAL) and params [if redis.call('setnx', KEYS[6], ARGV[4]) ==
优化建议
- 调整过期清理任务参数:Redisson默认通过定时任务执行Lua脚本清理过期键,可修改
cleanUpKeysAmount(每次清理的键数量)和cleanUpDelay(清理间隔)来降低调用频率。示例配置:Config config = new Config(); config.useSingleServer() .setAddress("redis://127.0.0.1:6379") .setCleanUpKeysAmount(50) // 降低单次清理键数,默认100 .setCleanUpDelay(60000); // 延长清理间隔至60秒,默认10秒 - 切换至Redis原生过期机制:关闭Redisson客户端的过期清理任务,让Redis自身的主动/惰性过期机制处理。配置方式:
Redis默认每秒执行10次过期键采样,对性能影响极小,适合TTL较长的场景。config.setUseCleanUpKeysTask(false); - 检查缓存容量限制配置:若缓存设置了
maxSize,Redisson会触发LRU/LFU淘汰逻辑,即使键未过期也会频繁执行清理。若无需容量限制,移除maxSize配置;若必须保留,调大maxSize以减少触发频率。 - 升级Redisson版本:3.16.0版本存在过期清理逻辑的性能缺陷,后续版本(如3.23.x)对该模块做了优化,减少了不必要的Lua脚本调用,升级后可缓解CPU占用问题。
- 验证TTL实际生效情况:排查代码中是否存在手动覆盖TTL的逻辑(如调用
set方法时指定了更短的过期时间),若有则修正,避免大量键提前进入过期队列增加清理压力。
内容的提问来源于stack exchange,提问作者Osama Jetawe
相关产品推荐
相关产品推荐

