Redis里到底哪个Key最占内存?我用Redis Insight直接把它翻了出来!

0 阅读7分钟

在这里插入图片描述

我一直觉得,Redis 真正难排查的地方,不是“不会命令”,而是信息太散

内存突然涨了,要看 INFO;怀疑有大 Key,要继续查大小;接口偶尔变慢,又得翻 Slow Log;想确认某个 Hash 里到底有什么,还要再进命令行。

命令都不复杂,但问题一旦混在一起,人就很容易在几个终端窗口之间来回切。

所以我后来更习惯先把 Redis 的整体情况看清楚,再决定下一步敲什么命令。

Redis Insight 对我最有用的地方就在这里:Key、TTL、内存分布、Key 详情、命令执行和慢查询,可以集中在一个界面里看。

在这里插入图片描述

它不会替代 redis-cli,但会让排查顺序清楚很多。


先看 Key,比一上来敲命令更容易找到方向

连接 Redis 后,我最常打开的是 Browser。

页面里可以直接看到当前数据库里的 Key、类型、TTL 和大小。Hash、String、List、Sorted Set 混在一起时,这种列表视图尤其直观。

Redis Insight Key浏览

比如看到一批 session:* Key 数量突然很多,或者某些本应该自动过期的 Key 一直没有 TTL,第一轮排查方向基本就有了。

我现在更习惯按这个顺序看:

先看 Key 分布 → 再看 TTL 和大小 → 最后决定要不要继续查内存或慢命令。

这样比一开始就把所有命令都敲一遍省事得多。


点开一个 Key,TTL、字段和值都能直接看

选中某个 Key 后,右侧可以继续查看内部内容。

Redis Key详情

如果是 Hash,可以直接看到字段和值;如果是 List、Set、Sorted Set,也能按对应结构查看。

这对开发调试很方便。

很多 Redis 问题并不是“Redis 挂了”,而是数据越放越乱:同一个业务前缀下,有的 Key 有 TTL,有的没有;有的对象只有几个字段,有的已经膨胀得很大。

先把结构摊开看清楚,往往比直接猜命令更有效。


真正遇到内存上涨,我最先想知道的是“谁在吃内存”

如果 Redis 内存持续上涨,只知道“总共用了多少”还不够。

更关键的问题是:

到底是哪一类数据、哪一批 Key、哪个业务前缀把内存吃掉了?

Redis Insight 的 Database Analysis 会把数据类型和 Key 的占用情况做成更直观的分析。

Redis数据库分析

这时候 INFO memory 和分析页面的作用就很不一样:

  • INFO memory 更适合告诉我“现在用了多少”;
  • 分析页面更适合帮我找“内存花到哪里去了”。

实际排查时,我会重点看四件事:

  1. 哪种数据类型占比突然异常;
  2. 最大的 Key 是哪些;
  3. 某个业务前缀是不是明显膨胀;
  4. 本该过期的数据是不是长期留着。

先把异常对象找出来,再回命令行精确确认,会比从全库一点点扫快很多。


需要敲命令时,Workbench正好接上

Redis Insight 并不是为了让人彻底离开命令行。

我反而觉得它好用的一点是:图形界面负责找方向,Workbench负责做精确确认。

Redis Insight Workbench

比如已经发现 user:* 这一批 Key 值得继续查,可以直接执行:

SCAN 0 MATCH user:* COUNT 100

需要检查一个 Hash:

HGETALL user

如果要确认界面里的修改是否已经真实写进 Redis,也可以继续用 redis-cli 验证:

redis-cli -h <REDIS_IP> -p 6379 -a <PASSWORD>

SELECT 1
SCAN 0 MATCH user
HGETALL user

继续增加字段:

HSET user age 22 phone 13800138000
HGETALL user

命令行验证Redis数据

这样一来,界面和命令行不是二选一,而是各做自己更擅长的事。


Redis偶尔变慢,Slow Log比“盯CPU”更值得先看

还有一种情况很常见:Key 看起来没什么异常,内存也没爆,但接口偶尔就是会慢一下。

这时候 Slow Log 很值得看。

Redis 的慢日志会记录超过设定执行时间的命令。Redis Insight 把这些记录直接列出来,不需要每次都手动执行 SLOWLOG GET 再自己整理。

我通常会重点注意:

  • 复杂集合操作是不是突然变慢;
  • 有没有高复杂度命令被频繁调用;
  • 某个大 Key 是否又叠加了慢操作;
  • 延迟尖峰出现的时间点和具体命令能不能对应上。

大 Key 和慢命令往往不是两个完全独立的问题。一个集合越大,某些遍历和聚合操作的代价就越高。

所以我更喜欢先从 Key 和内存分析找到可疑对象,再结合 Slow Log 往下追。


Docker部署并不复杂,先把服务跑起来

如果服务器已经有 Docker,Redis Insight 可以直接使用官方镜像启动:

docker run -d \
  --name redisinsight \
  -p 5540:5540 \
  -v redisinsight:/data \
  redis/redisinsight:latest

启动后检查容器状态:

docker ps

浏览器访问:

http://服务器IP:5540

Redis Insight启动页面

这里有一个容易混淆的地方:

5540 是 Redis Insight Web 页面使用的端口;Redis Sentinel 是另一套高可用组件,默认端口是 26379。

两者解决的问题完全不同,不要混在一起配置。


连接 Redis 时,优先走内网地址

进入 Redis Insight 后,添加 Redis 数据库,填写实例地址、端口和认证信息即可。

添加Redis数据库

连接成功后,就可以直接进入 Browser、Workbench、Analysis 等页面。

Redis连接成功

如果 Redis Insight 和 Redis 在同一台服务器或同一内网,我更建议让它们直接走内网地址。

Redis 默认数据端口是 6379,不要为了远程管理方便,直接把 6379 暴露到公网。

真正需要远程排查时,开放 Redis Insight 的 Web 管理入口更合适。


人不在内网时,我只把 Redis Insight 页面放出去

本地查看没有问题之后,我更关心的是另一个场景:

Redis 真出问题时,我不一定正坐在服务器旁边。

我的做法是让 Redis 继续留在内网,Redis Insight 继续通过内网连接 Redis;需要远程时,只给 Redis Insight 的 5540 Web 页面增加一个公网访问入口。

在这里插入图片描述

服务器上安装 cpolar:

sudo curl https://get.cpolar.sh | sh

确认服务状态:

sudo systemctl status cpolar

浏览器进入 cpolar Web UI:

http://服务器IP:9200

cpolar Web UI

创建 HTTP 隧道时,将本地端口指向 Redis Insight 的 5540

协议:http
本地端口:5540

创建Redis Insight公网隧道

创建成功后,可以在在线隧道列表中看到公网地址:

cpolar公网地址

在外网浏览器打开这个地址,就能进入 Redis Insight 页面:

外网访问Redis Insight

如果只是临时排查,随机公网地址就可以完成验证;如果准备长期作为运维入口使用,再配置固定地址和更严格的访问控制。

需要注意的是,Redis Insight 本身具备查看和修改 Redis 数据的能力,所以远程访问时同样要重视认证、Redis ACL/密码和访问范围。


我更愿意把它叫“Redis排查工作台”

Redis Insight 最开始给我的感觉,只是“把 Redis 命令行做成网页”。

真正用下来以后,我觉得这个理解太简单了。

它减少的不是敲命令的次数,而是排查时在不同信息之间来回切换的成本

Redis 出问题时,最怕的不是不会某条命令,而是:

我知道很多命令,却不知道这一刻应该先看什么。

Redis Insight 的价值就在这里。

先把 Key、TTL、大小、内存分布和慢查询放到眼前,再决定下一步往哪里查;需要精确确认时,再进入 Workbench 或 redis-cli。

对于刚开始接触 Redis 的人,它能降低排查门槛;对于本来就熟悉命令行的人,它也不会取代 redis-cli,而是帮人更快找到下一条该敲的命令。

所以如果让我给它一个更实际的定位,我不会只叫它“Redis 图形客户端”。

我更愿意叫它:

Redis 排查工作台。

当 Redis 真出现内存上涨、Key 异常或者接口变慢时,先把问题看清楚,再下命令,会比一开始就开好几个终端窗口舒服得多。