最轻量方式是用 redisTemplate.getRequiredConnectionFactory().getConnection().info("memory") 获取实时内存数据,返回 Properties 包含 used_memory 等字段;Actuator 的 /actuator/metrics/redis.usedMemory 是生产推荐方式,但仅反映主连接且有延迟;Redis 6+ 启用 maxmemory-policy 后 used_memory 可能因驱逐突降,需结合 evicted_keys 和 JVM 堆内存综合分析。

能直接监控,但得靠 INFO memory 命令或 Actuator 暴露的指标,不能只靠 redisTemplate 自带方法。
用 redisTemplate.getConnection().info("memory") 获取实时内存数据
这是最轻量、最可控的方式,绕过 Actuator 依赖,适合写自定义监控服务或定时巡检。
-
redisTemplate.getRequiredConnectionFactory().getConnection().info("memory")返回的是Properties对象,包含used_memory、used_memory_human、mem_fragmentation_ratio等关键字段 - 注意:该调用会触发一次 Redis 的
INFO memory请求,不要在高频接口里反复调用(比如每请求一次) - 如果使用 Lettuce,默认连接是共享的,频繁调用
getConnection()不会新建连接,但要注意连接是否被提前关闭(比如配置了超时或连接池回收) - 返回值中
used_memory_human是带单位的字符串(如"147.13M"),解析前需做格式校验,避免NumberFormatException
通过 Actuator 的 /actuator/metrics/redis.usedMemory 查看聚合指标
这是生产环境推荐的标准化方式,但默认不开启,且指标含义有局限。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 必须显式启用:
management.endpoints.web.exposure.include=health,metrics,并确保spring-boot-starter-actuator和micrometer-registry-*(如 Prometheus)已引入 -
/actuator/metrics/redis.usedMemory实际上报的是 Micrometer 封装后的gauge值,单位是字节,数值来源是客户端采集(不是直连 Redis 执行INFO),存在延迟和采样间隔影响 - 该指标只反映当前连接所见的内存用量,若应用有多个 Redis 连接(如多数据源),它只统计主连接或第一个自动装配的连接
- 不包含
mem_fragmentation_ratio或used_memory_peak这类关键诊断字段,需额外走info("memory")补充
Redis 6+ 启用 maxmemory-policy 后,used_memory 可能突然跳变
这不是监控逻辑问题,而是 Redis 自身行为导致的数据“失真”,容易误判为内存泄漏。
- 当配置了
maxmemory且策略为allkeys-lru或volatile-lru时,Redis 会在内存逼近阈值时批量驱逐 key,used_memory可能从 900MB 直降到 300MB —— 这是正常行为,不代表应用缓存失效逻辑出错 - 监控告警阈值不能只盯绝对值,建议同时观察
evicted_keys(来自info("stats"))和keyspace_hits/keyspace_misses(来自info("keyspace")),判断是否因驱逐引发大量缓存 miss - Lettuce 客户端默认启用了命令重试,若驱逐期间发生
OOM command not allowed错误,可能被静默重试,日志里未必留下痕迹
真正麻烦的不是怎么取值,而是把 used_memory、mem_fragmentation_ratio、evicted_keys 和 JVM 堆内存走势放在一起看 —— 单独一个数字,几乎无法定位问题是出在 Redis 本身、客户端序列化开销、还是连接泄漏上。

















