首页 / Redis 入门教程 / redis-cli 实战基础

Redis 入门教程

redis-cli 实战基础

本教程共 40 篇 · 第 4 篇 · 更新于 2026-08-02

redisredis-cli命令行RESP批量执行

4. redis-cli 实战基础

本节目标

  • 区分 redis-cli 的「命令行模式」与「交互模式」,并理解 raw / no-raw 输出
  • 掌握连接远程实例的参数:-h-p-a-n-u
  • 会用管道、文件、-x 批量为 Redis 灌数据
  • --scan--bigkeys--stat 等运维利器排查键空间
  • 了解 RESP 协议是什么,以及 redis-cli 自带 HELP

redis-cli 是 Redis 自带的命令行客户端,也是日常开发、调试、运维里用得最频繁的工具。它随 Redis 一起安装,无需额外依赖。

4-1 两种基本用法

命令行模式(一次性执行)

把命令作为参数直接传给 redis-cli,执行完即退出,返回值打印到标准输出:

redis-cli INCR mycounter
(integer) 7

注意输出里的 (integer)"..." 这类「类型提示」——因为 Redis 的回复是有类型的(字符串、数组、整数、空、错误等),redis-cli 在终端里会额外显示类型信息,方便人读。

交互模式(REPL)

不带参数直接运行,就进入交互式终端,可以连续敲命令:

redis-cli
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> SET foo bar
OK
127.0.0.1:6379> GET foo
"bar"

提示符 127.0.0.1:6379> 显示当前连接的地址和端口;当你用 SELECT 切换到别的数据库时,提示符会变成 127.0.0.1:6379[2]>

交互模式下 redis-cli 还提供了接近 shell 的编辑体验:用上下方向键调出命令历史(历史保存在用户家目录的 .rediscli_history 文件里,跨重启保留);输入命令名前缀后按 Tab 可自动补全命令;输入命令名后还会显示语法提示(hints),例如键入 Z 再按 Tab 会补全为 ZADDZCARD 等。从 Redis 8.8 起,redis-cli 还支持 Alt/Option + ←/→Ctrl + ←/→ 的「按词跳转」,编辑长命令更顺手。这些体验由内置的 linenoise 库提供,不依赖系统的 readline。

4-2 输出格式:raw 与 no-raw

当标准输出是终端时,redis-cli 显示带类型提示的「人类可读」格式;一旦输出被重定向到文件或管道,它会自动切换成 raw 模式

redis-cli INCR mycounter > /tmp/output.txt
cat /tmp/output.txt
8

可以看到 (integer) 消失了,只剩纯数字——这正是脚本/管道需要的干净格式。你也可以强制指定:

# 强制 raw(终端里也只显示纯值)
redis-cli --raw INCR mycounter
# 强制带类型提示(即使重定向到文件)
redis-cli --no-raw INCR mycounter

另外,--csv 可以把数组结果输出成 CSV,便于导出:

redis-cli LPUSH mylist a b c d
redis-cli --csv LRANGE mylist 0 -1
"d","c","b","a"

提示:从 Redis 8.8 起,redis-cli 还支持 --json 把结果输出为 JSON(默认走 RESP3 协议,-2 可切回 RESP2)。在处理脚本输出、对接其他程序时很方便。

4-3 连接参数

主机、端口、密码、库号

# 指定主机和端口
redis-cli -h redis15.localnet.org -p 6390 PING
# 带密码(不推荐明文,见下)
redis-cli -a myUnguessablePazzzzzword123 PING
# 操作非默认数据库(编号为 1 的库)
redis-cli -n 1 INCR a
PONG

安全建议:在命令行用 -a 明文写密码会留在 shell 历史里。更安全的做法是把密码放进环境变量:

export REDISCLI_AUTH=myUnguessablePazzzzzword123
redis-cli PING

用 URI 一口气指定

redis-cli -u redis://default:PASSWORD@localhost:6379/0 PING

URI 格式:redis://user:password@host:port/dbnum。其中 user、password、dbnum 都可省略;不带用户名时用 default;走 TLS 时把协议改成 rediss://

交互模式里切换连接

127.0.0.1:6379> CONNECT metal 6379
metal:6379> PING
PONG

如果连不上,redis-cli 会进入 not connected> 状态,并在你每次发命令时自动尝试重连。

4-4 从其他程序喂数据

-x 把 stdin 作为最后一个参数

适合把文件内容直接存进一个 key:

cat /etc/services | redis-cli -x SET net_services

用文件批量执行

把若干命令写进文本文件,然后管道给 redis-cli,它会逐条执行:

cat /tmp/commands.txt
SET item:3374 100
INCR item:3374
APPEND item:3374 xxx
GET item:3374
cat /tmp/commands.txt | redis-cli
OK
(integer) 101
(integer) 6
"101xxx"

文件中若参数含空格,可用引号包住(如 SET arg "this is one arg")。

重复执行 -r-i

redis-cli -r 5 INCR counter_value
(integer) 1
(integer) 2
(integer) 3
(integer) 4
(integer) 5

-r 指定次数,-i 指定间隔秒数(支持小数,如 -i 0.1)。-1 表示无限循环,常配合 INFO 做监控:

redis-cli -r -1 -i 1 INFO | grep rss_human

4-5 键空间扫描与排查

--scan:安全地遍历键

不要在生产用 KEYS *(会阻塞服务器)。用 --scan,它底层走 SCAN,不阻塞:

redis-cli --scan --pattern 'user:*' | head -10

配合 --pattern 按模式过滤,-i 0.01 可降低扫描对服务器的压力。

--bigkeys / --memkeys:找出大 key

redis-cli --bigkeys

它会扫描整个键空间,按类型报告「最大的 key」和平均大小,是排查内存异常的利器。新版还提供 --memkeys(按内存占用)和 --keystats(两者结合 + 分布统计)。这些命令基于 SCAN,可在忙碌的服务器上安全执行。

--stat:实时统计

redis-cli --stat

每秒打印一行:键数量、内存、客户端数、请求数等变化,适合实时观察负载。

4-6 其他实用模式

  • 发布订阅模式:直接 redis-cli PSUBSCRIBE '*' 即可订阅频道,终端会阻塞等待消息,按 Ctrl-C 退出。
  • MONITORredis-cli MONITOR 实时打印服务器收到的所有命令,调试联调用,但生产慎用(有性能开销)。
  • 延迟检测--latency--latency-history--latency-dist 测量实例延迟;--intrinsic-latency 5 测量本机系统自身延迟(需在 Redis 所在机器上跑)。
  • 远程 RDB 备份redis-cli --rdb /tmp/dump.rdb 把远程实例的 RDB 拉到本地,简单有效的灾备手段。
  • 执行 Lua 脚本redis-cli --eval script.lua KEY1 KEY2 , ARG1 ARG2(注意 keys 与 args 之间用逗号分隔)。

4-7 内置帮助 HELP

不离开终端就能查命令用法:

127.0.0.1:6379> HELP @string
127.0.0.1:6379> HELP SET
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
summary: Set the string value of a key
since: 1.0.0

HELP @<类别> 按分组列出命令(如 @string@hash@list@generic),支持 Tab 补全。

4-8 初识 RESP 协议

redis-cli 与 Redis 服务器之间通信用的是 RESP(REdis Serialization Protocol)——一种简单、可读、二进制安全的文本协议。例如客户端发 SET foo bar\r\n,服务器回 +OK\r\n。RESP 有 RESP2(长期默认)与 RESP3(更新,支持更丰富的推消息类型)两代。redis-cli 默认协商使用较新的协议;你也可以用 -2 强制 RESP2、-3 强制 RESP3。

知道 RESP 的存在就够了——日常用 redis-cli 或任意语言的客户端库都不需要手写协议,但当你在排「返回值格式」问题(比如 raw 模式、--csv--json)时,理解「回复是带类型的」会很有帮助。

4-9 常见误区

  • 误区:用 KEYS * 看所有键。 生产大数据量下会长时间阻塞,应该用 --scanSCAN
  • 误区:-a 明文密码无所谓。 它会留在 shell 历史,优先用 REDISCLI_AUTH 环境变量。
  • 误区:交互模式断线后事务还在。 重连后 MULTI/EXEC 状态会丢失(详见事务章节),这是已知限制。
  • 误区:命令历史只在本机。 历史存在用户家目录的 .rediscli_history,多用户机器注意权限。

4-10 小结

redis-cli 是 Redis 世界的「瑞士军刀」:

  • 两种模式:命令行一次性执行、交互式 REPL。
  • 连接参数:-h -p -a -n -u,密码优先用 REDISCLI_AUTH
  • 灌数据:-x、文件管道、-r/-i 重复执行。
  • 运维排查:--scan(替代 KEYS)、--bigkeys--stat--rdb
  • 辅助:HELPMONITOR、发布订阅、Lua 脚本、延迟检测。
  • 底层是 RESP 协议,回复带类型,raw/no-raw/csv/json 控制输出形态。

提示:版本基线说明。本教程正文统一以 Redis 8.x(最新稳定版) 表述。需要留意:官方 redis.io 下载页目前把 8.8 标注为 “Latest stable”,而 GitHub 上 redis/redis 的最新发布标签为 8.10.0;二者同属 8.x 大版本,命令与数据类型差异极小,本教程以 8.10.0 为准。

下一章我们从全局视角总览 Redis 的全部数据类型,并给出「什么场景用什么类型」的选型建议。