跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何在Spring Boot中配置Redis的慢日志监控_通过RedisTemplate调用config get命令

RedisTemplate 未封装 CONFIG 命令因其属运维管理范畴,业务层应避免直接调用;获取慢日志需通过 RedisConnection.executeCommand 手动执行 SLOWLOG GET 或 CONFIG GET,并注意权限、连接释放及云环境限制。 Redis 慢日志不能通过
RedisTemplate
直接获取,因为
CONFIG GET
不在
RedisTemplate
的标准操作封装范围内;必须绕过它,用底层
Connection
手动执行。 为什么
RedisTemplate
没有
configGet
方法
RedisTemplate
是对 Redis 命令的高层抽象,只覆盖常用数据结构操作(如
opsForValue()
、
opsForHash()
),而
CONFIG
属于服务端管理命令,被刻意排除在模板 API 之外。Spring Data Redis 认为这类命令属于运维范畴,不鼓励业务代码直接调用。 调用
redisTemplate.opsForValue().get("CONFIG")
会报错 ——
no such key
,因为它真去查 key,不是发 CONFIG 命令
redisTemplate.execute()
虽可执行任意命令,但需手动处理序列化/反序列化,且对
CONFIG GET
这类返回 List 的响应不友好 真正可用的是
RedisConnection
的
executeCommand()
,它原生支持
CONFIG
、
INFO
、
SLOWLOG
等管理命令 用
RedisConnection
获取慢日志配置(
slowlog-log-slower-than
) 慢日志开关和阈值由两个配置项控制:
slowlog-log-slower-than
(微秒)和
slowlog-max-len
。它们不能用
RedisTemplate
读,但能用连接对象拿到:
RedisConnection conn = redisTemplate.getConnectionFactory().getConnection(); try { // 执行 CONFIG GET slowlog-log-slower-than List result = conn.executeCommand( RedisCommandFactory.create("CONFIG", "GET", "slowlog-log-slower-than") ); if (result != null && !result.isEmpty() && result.size() >= 2) { String threshold = new String(result.get(1)); System.out.println("slowlog-log-slower-than = " + threshold + " μs"); } } finally { conn.close(); }
注意:返回结果是
List
,格式为
[b"slowlog-log-slower-than", b"10000"]
,取下标 1 才是值 必须手动
conn.close()
,否则连接泄漏(
RedisConnectionFactory
不自动回收裸连接) 若 Redis 启用了密码,
getConnection()
会自动鉴权;但若用的是 Lettuce,某些旧版本需显式调用
openConnection()
获取实际慢日志条目(
SLOWLOG GET
)
SLOWLOG GET
返回的是数组结构(每条日志含时间戳、耗时、命令等),比
CONFIG GET
更复杂,建议封装成工具方法: Redis 8.2.3 Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。 下载
public List> getSlowLog(int count) { RedisConnection conn = redisTemplate.getConnectionFactory().getConnection(); try { byte[][] args = {String.valueOf(count).getBytes()}; List raw = conn.executeCommand( RedisCommandFactory.create("SLOWLOG", "GET", args) ); return parseSlowLog(raw); } finally { conn.close(); } } private List> parseSlowLog(List raw) { List> logs = new ArrayList<>(); for (byte[] entry : raw) { // SLOWLOG GET 返回嵌套数组:[ [id, ts, duration, command], [...] ] // 实际解析需按 Redis 协议逐层拆解,推荐用 jedis 或 lettuce 原生 client 更稳妥 } return logs; }
SLOWLOG GET
默认最多返回 128 条,加参数可指定数量,如
SLOWLOG GET 10
直接解析
byte[][]
容易出错,尤其当命令含空格或二进制参数时;生产环境建议改用
Jedis
或
LettuceClient
实例调用
slowLogGet()
slowlog-log-slower-than 0
表示记录所有命令(慎用),
-1
表示关闭慢日志 容易忽略的权限与兼容性问题 即使代码写对,也可能因环境限制失败: Redis 6+ 启用 ACL 后,普通用户默认无
CONFIG
或
SLOWLOG
权限,需显式授权:
ACL SETUSER myuser +config|get +slowlog
云 Redis(如阿里云、腾讯云)通常禁用
CONFIG
和
SLOWLOG
命令,此时只能依赖平台提供的监控面板
redisTemplate.getRequiredConnectionFactory().getConnection().info("slowlog")
无效 ——
INFO
不支持
slowlog
section,只能用
SLOWLOG GET
Spring Boot 3.x + Lettuce 6.x 起,
RedisConnection
的
executeCommand
已标记为 deprecated,未来需迁移到
StatefulRedisConnection
的
sync().slowlogGet()
真正稳定的方案不是死磕
RedisTemplate
,而是明确区分:业务缓存走
RedisTemplate
,运维监控走原生客户端或平台 API。

相关文章