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<String> 的响应不友好 - 真正可用的是
RedisConnection的executeCommand(),它原生支持CONFIG、INFO、SLOWLOG等管理命令
用 RedisConnection 获取慢日志配置(slowlog-log-slower-than)
慢日志开关和阈值由两个配置项控制:slowlog-log-slower-than(微秒)和 slowlog-max-len。它们不能用 RedisTemplate 读,但能用连接对象拿到:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
RedisConnection conn = redisTemplate.getConnectionFactory().getConnection();
try {
// 执行 CONFIG GET slowlog-log-slower-than
List<byte[]> 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<byte[]>,格式为[b"slowlog-log-slower-than", b"10000"],取下标 1 才是值 - 必须手动
conn.close(),否则连接泄漏(RedisConnectionFactory不自动回收裸连接) - 若 Redis 启用了密码,
getConnection()会自动鉴权;但若用的是 Lettuce,某些旧版本需显式调用openConnection()
获取实际慢日志条目(SLOWLOG GET)
SLOWLOG GET 返回的是数组结构(每条日志含时间戳、耗时、命令等),比 CONFIG GET 更复杂,建议封装成工具方法:
public List<Map<String, Object>> getSlowLog(int count) {
RedisConnection conn = redisTemplate.getConnectionFactory().getConnection();
try {
byte[][] args = {String.valueOf(count).getBytes()};
List<byte[]> raw = conn.executeCommand(
RedisCommandFactory.create("SLOWLOG", "GET", args)
);
return parseSlowLog(raw);
} finally {
conn.close();
}
}
private List<Map<String, Object>> parseSlowLog(List<byte[]> raw) {
List<Map<String, Object>> 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不支持slowlogsection,只能用SLOWLOG GET - Spring Boot 3.x + Lettuce 6.x 起,
RedisConnection的executeCommand已标记为 deprecated,未来需迁移到StatefulRedisConnection的sync().slowlogGet()
真正稳定的方案不是死磕 RedisTemplate,而是明确区分:业务缓存走 RedisTemplate,运维监控走原生客户端或平台 API。

















