【Redis 基础】认识和使用 redis-cli
数据是现代应用的基石,而内存数据库因其卓越的性能,在缓存、会话存储、排行榜、实时分析等众多场景中扮演着不可或缺的角色。在这片领域中,Redis 无疑是最耀眼的明星之一。它不仅仅是一个简单的键值存储,更是一个功能丰富的内存数据结构服务器。
然而,无论 Redis 的功能多么强大,对于开发者和系统管理员来说,与它进行交互始终是日常工作中绕不开的一环。除了通过各种编程语言的客户端库连接 Redis 之外,Redis 提供了一个官方的、强大且易用的命令行接口工具——redis-cli
。
redis-cli
是学习、探索、管理和调试 Redis 服务的首选工具。它允许我们直接输入 Redis 命令,查看服务器响应,监控服务器状态,甚至进行一些高级操作,如数据导入导出、性能诊断等。掌握 redis-cli
的使用,是深入理解和高效利用 Redis 的基础。
本文将带你由浅入深地认识和使用 redis-cli
,从最基本的连接到服务器,到执行常用命令,再到探索其高级功能和各种命令行选项。
第一章:什么是 redis-cli
?它为何重要?
1.1 定义与作用
redis-cli
是 Redis 官方提供的命令行客户端工具(Command Line Interface)。它是一个独立的二进制程序,通常与 Redis 服务器一起安装。
redis-cli
的主要作用包括:
- 交互式操作: 以交互模式连接到 Redis 服务器,直接输入 Redis 命令并立即看到执行结果。这是学习 Redis 命令、测试功能、进行即时查询和修改数据最直接的方式。
- 非交互式执行: 在 shell 脚本或命令行中直接执行单个 Redis 命令,便于自动化和集成。
- 管理与监控: 提供多种选项用于监控 Redis 服务器的性能、连接、内存使用等状态,执行管理任务如关闭服务器、保存数据等。
- 调试与故障排除: 在遇到问题时,
redis-cli
是诊断连接问题、命令执行错误、性能瓶颈等的有力工具。 - 数据传输: 支持导入导出 RDB 文件、利用管道进行批量操作。
1.2 为何 redis-cli
如此重要?
尽管几乎所有主流编程语言都有成熟的 Redis 客户端库,但在以下情况下,redis-cli
的作用无可替代:
- 快速验证: 当你不确定某个命令的语法或行为时,打开
redis-cli
快速测试比编写和运行一段程序要快得多。 - 即时状态检查: 想知道服务器有多少键?内存使用了多少?有多少客户端连接?
redis-cli
的INFO
、DBSIZE
、CLIENT LIST
等命令能立刻给你答案。 - 管理任务: 执行
SHUTDOWN
、SAVE
、BGSAVE
、FLUSHALL
等管理命令,通常通过redis-cli
来完成。 - 学习过程: 学习 Redis 数据结构和命令的最佳方式就是亲手在
redis-cli
中实践。 - 自动化与脚本: 在 shell 脚本中集成 Redis 操作,
redis-cli
的非交互模式是理想选择。 - 性能分析:
redis-cli
提供了--stat
,--latency
等强大的性能分析工具。
简而言之,redis-cli
是 Redis 生态系统中不可或缺的一部分,是与 Redis 服务器沟通的“瑞士军刀”。
第二章:获取与连接 redis-cli
2.1 安装 redis-cli
redis-cli
通常是作为 Redis 服务器安装包的一部分提供的。当你按照官方指南或通过包管理器(如 apt、yum、brew)安装 Redis 服务器时,redis-cli
通常也会被一同安装到系统的 PATH 环境变量所指向的目录中(例如 /usr/local/bin
或 /usr/bin
),这样你就可以在任何终端窗口直接调用 redis-cli
命令。
如果你只想要 redis-cli
而不安装完整的 Redis 服务器,你也可以从 Redis 官方网站下载 Redis 源码包,编译后只使用 src/redis-cli
这个可执行文件。
验证 redis-cli
是否安装成功,只需打开终端并输入:
bash
redis-cli --version
如果看到类似 redis-cli 6.2.6
的输出,说明 redis-cli
已经准备就绪。
2.2 连接本地 Redis 服务器
默认情况下,redis-cli
会尝试连接到本地主机(127.0.0.1
)上运行在默认端口(6379
)的 Redis 服务器。
只需简单地在终端输入:
bash
redis-cli
如果连接成功,你将看到一个类似于 127.0.0.1:6379>
的提示符,这表示你已经进入了 redis-cli
的交互模式,可以开始输入 Redis 命令了。
bash
$ redis-cli
127.0.0.1:6379>
如果 Redis 服务器不在默认地址或端口运行,或者需要密码认证,你需要使用相应的命令行选项。
2.3 连接远程或非默认配置的 Redis 服务器
redis-cli
提供了多个命令行选项来指定连接参数:
-h <hostname>
:指定 Redis 服务器的主机名或 IP 地址。-p <port>
:指定 Redis 服务器的端口号。-a <password>
:指定连接 Redis 服务器所需的密码。
示例 1:连接到运行在 IP 地址 192.168.1.100,端口 6380 的服务器
bash
redis-cli -h 192.168.1.100 -p 6380
如果连接成功,提示符将变为 192.168.1.100:6380>
。
示例 2:连接到本地服务器,但需要密码 “mypassword”
bash
redis-cli -a mypassword
或者,更安全的做法是使用环境变量或配置文件,但对于命令行测试,-a
是最直接的方式(注意:在某些环境中,命令行参数可能被记录在历史中,存在安全风险)。
连接成功后,提示符仍然是 127.0.0.1:6379>
(如果未指定主机端口) 或 <host>:<port>>
,但内部已经完成了认证。
示例 3:连接到远程服务器,指定主机、端口和密码
bash
redis-cli -h 192.168.1.100 -p 6380 -a mypassword
连接成功后,提示符将是 192.168.1.100:6380>
。
2.4 指定数据库
Redis 支持多个数据库(默认从 0 到 15)。你可以使用 -n <db_number>
选项在连接时指定要使用的数据库。
示例:连接到本地服务器,并切换到数据库 1
bash
redis-cli -n 1
连接成功后,提示符可能是 127.0.0.1:6379[1]>
,方括号中的数字表示当前正在使用的数据库索引。在交互模式下,你也可以使用 SELECT <db_number>
命令切换数据库。
bash
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]>
第三章:redis-cli
的交互模式:基础操作
连接成功进入 redis-cli
交互模式后,你就可以像与 Redis 服务器直接对话一样,输入命令并查看结果。
3.1 输入命令与获取响应
在提示符 host:port>
或 host:port[db]>
后输入 Redis 命令,按回车键执行。
示例:
bash
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> SET mykey "Hello Redis"
OK
127.0.0.1:6379> GET mykey
"Hello Redis"
127.0.0.1:6379> EXISTS mykey
(integer) 1
127.0.0.1:6379> DEL mykey
(integer) 1
127.0.0.1:6379> GET mykey
(nil)
127.0.0.1:6379> EXISTS mykey
(integer) 0
127.0.0.1:6379> INCR mycounter
(integer) 1
127.0.0.1:6379> INCR mycounter
(integer) 2
从上面的例子可以看到,redis-cli
会将服务器的响应清晰地展示出来。不同的 Redis 命令会返回不同类型的响应。
3.2 理解 Redis 响应类型
Redis 协议(RESP – REdis Serialization Protocol)定义了多种数据类型,redis-cli
会以易读的方式呈现这些类型:
- 简单字符串 (Simple Strings): 通常用于成功、错误、状态信息。在
redis-cli
中直接显示,如OK
,PONG
。 - 错误 (Errors): 表示命令执行失败。以
(error)
开头显示错误信息,如(error) ERR unknown command 'FOOBAR'
。 - 整数 (Integers): 返回一个数字。以
(integer)
开头显示,如(integer) 1
,(integer) 0
。 - 批量字符串 (Bulk Strings): 返回一个字符串值(可能是二进制安全的)。用双引号
""
包围显示,如"Hello Redis"
。如果返回的值不存在,显示为(nil)
。 - 数组 (Arrays): 返回一个有序的元素列表。元素可以是任意 RESP 类型。
redis-cli
会列出数组的每个元素,通常以序号开头1)
,2)
等,并显示元素的类型和值。
示例:返回数组的命令
bash
127.0.0.1:6379> RPUSH mylist "item1" "item2" "item3"
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1
1) "item1"
2) "item2"
3) "item3"
127.0.0.1:6379> HSET myhash field1 "value1" field2 "value2"
(integer) 2
127.0.0.1:6379> HGETALL myhash
1) "field1"
2) "value1"
3) "field2"
4) "value2"
理解这些响应类型对于正确解析 redis-cli
的输出至关重要。
3.3 获取命令帮助
如果你不确定某个 Redis 命令如何使用,可以在 redis-cli
交互模式下使用 HELP
命令:
“`bash
127.0.0.1:6379> HELP GET
GET key
summary: Get the value of a key
since: 1.0.0
groups: [string]
127.0.0.1:6379> HELP SET
SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT millisecondsTimestamp|KEEPTTL] [NX|XX] [GET]
summary: Set the string value of a key
since: 1.0.0
groups: [string]
127.0.0.1:6379> HELP
redis-cli: hgetall key
Get all the fields and values in a hash
redis-cli: hmset key field value [field value …]
Set multiple hash fields to multiple values
… 会列出所有命令的简介
“`
HELP
后跟命令名可以查看该命令的详细用法、功能简介、版本要求和所属命令组。只输入 HELP
会列出所有命令的简要描述。
3.4 交互模式的其他特性
- 命令历史: 使用键盘的向上/向下箭头可以查看之前输入的命令,方便重复执行或修改。
- 自动补全: 输入命令的前几个字母后按 Tab 键,
redis-cli
会尝试补全命令名。如果匹配多个命令,双击 Tab 会列出所有匹配项。
3.5 退出交互模式
输入 QUIT
或 EXIT
命令,或者按下 Ctrl+C
组合键,都可以退出 redis-cli
交互模式,返回到系统的 shell 提示符。
bash
127.0.0.1:6379> QUIT
$ # 回到了系统终端
第四章:redis-cli
的非交互模式与命令行选项
除了强大的交互模式,redis-cli
也可以直接在命令行中执行单个命令,这非常适合脚本自动化。同时,它提供了丰富的命令行选项来控制行为和提供高级功能。
4.1 非交互模式
在启动 redis-cli
时,直接在命令后跟上要执行的 Redis 命令及其参数,redis-cli
会连接到服务器,执行该命令,然后退出。
示例:
“`bash
获取键 ‘mykey’ 的值
redis-cli GET mykey
设置键 ‘anotherkey’ 的值
redis-cli SET anotherkey “some value”
删除键 ‘mykey’ 和 ‘anotherkey’
redis-cli DEL mykey anotherkey
使用其他主机和端口执行命令
redis-cli -h 192.168.1.100 -p 6380 -a mypassword GET remote_key
“`
非交互模式的输出通常是原始的、不带格式的字符串(相当于 --raw
选项的效果),这便于脚本解析。
示例:使用管道批量执行命令
你可以通过管道将多个命令发送给 redis-cli --pipe
,实现批量执行,这比单个命令逐个执行效率更高(尽管 --pipe
通常用于更复杂的输入格式,但原理类似)。对于简单的多命令执行,可以直接通过标准输入:
bash
(echo "SET key1 value1"; echo "SET key2 value2"; echo "GET key1") | redis-cli -a mypassword
这种方式将 SET key1 value1
, SET key2 value2
, GET key1
三条命令通过管道发送给 redis-cli
。redis-cli
会依次执行它们。
4.2 重要的命令行选项详解
redis-cli
提供了大量的命令行选项来定制连接、控制输出、执行特殊任务等。我们来详细介绍一些最常用的和有用的选项(除了连接选项 -h
, -p
, -a
, -n
之外):
-
--raw
和--no-raw
:--raw
:以原始格式输出响应,不进行美化或类型标注(如(integer)
)。非交互模式默认开启此选项。--no-raw
:以格式化、易读的方式输出响应(默认行为,除非在非交互模式下)。
“`bash
默认非交互模式输出(raw)
$ redis-cli GET mykey
“Hello Redis”使用 –no-raw 选项
$ redis-cli –no-raw GET mykey
“Hello Redis” # GET 命令返回值本身就是字符串,raw 和 no-raw 可能看起来一样来看一个返回数字的例子
$ redis-cli INCR mycounter
2 # raw 输出可能就是数字 ‘2’$ redis-cli –no-raw INCR mycounter
(integer) 3 # no-raw 输出会带类型标注
“` -
-r <count>
:将同一个命令重复执行指定次数。“`bash
重复PING命令10次
redis-cli -r 10 PING
每秒执行一次INCR命令,总共执行5次(结合-i)
redis-cli -r 5 -i 1 INCR mycounter
“` -
-i <delay>
:在重复执行命令时,指定每次执行之间的延迟(秒)。可以接受小数(如 0.1 表示 100毫秒)。通常与-r
结合使用。 -
--stat
:实时显示 Redis 服务器的统计信息。这是一个非常有用的监控工具。它会连接到服务器并周期性地(默认每秒一次)打印INFO
命令中stats
部分的关键指标。“`bash
redis-cli –stat会持续输出类似这样的信息:
——- data ——- ——————— load ——————– – child –
keys mem clients blocked requests connections
1 910.96K 1 0 10 10
1 910.96K 1 0 11 11
1 910.96K 1 0 12 12
… 每秒更新 …
``
Ctrl+C` 退出。
按下 -
--scan
:使用SCAN
命令迭代数据库中的所有键。SCAN
是一个非阻塞命令,适合在生产环境中用来查找键,避免使用阻塞的KEYS
命令。“`bash
扫描当前数据库的所有键
redis-cli –scan
扫描匹配模式 “mykey:*” 的键
redis-cli –scan –match “mykey:*”
``
–scan` 选项会自动处理 SCAN 命令的游标(cursor)逻辑,直到遍历完所有键。 -
--latency
:测量客户端到服务器的网络延迟。它会发送 PING 命令并记录响应时间。“`bash
redis-cli –latency会持续输出延迟信息,直到按 Ctrl+C
min: 0, max: 1, avg: 0.20 (549 samples)
min: 0, max: 1, avg: 0.18 (1098 samples)
…
“`
-
--latency-history
:类似--latency
,但会周期性地(默认15秒)报告延迟的最小值、最大值和平均值。“`bash
redis-cli –latency-history会周期性输出
Fri Oct 27 10:30:00 2023 min: 0, max: 1, avg: 0.25 (1500 samples)
Fri Oct 27 10:30:15 2023 min: 0, max: 2, avg: 0.22 (1500 samples)
…
“`
-
--latency-dist
:以 ASCII 柱状图的形式显示延迟分布。“`bash
redis-cli –latency-dist会持续输出延迟分布图
0ms: |████████████████████████████████████████ (455)
1ms: | (0)
2ms: | (0)
…
“`
-
--pipe
:用于实现高效的批量命令执行(Pipelining)。它从标准输入读取 Redis 命令,并将它们打包成一个请求发送给服务器,然后一次性读取所有响应。这显著减少了网络往返时间(RTT)。你需要以 Redis 协议格式(RESP)或特定的
redis-cli --pipe
格式组织输入。更常见的方式是每行一个命令,然后redis-cli --pipe
会将其转换为 RESP 格式。示例:批量设置键
创建一个包含命令的文本文件(例如
commands.txt
):
SET key1 value1
SET key2 value2
SET key3 value3
然后使用管道发送:
bash
cat commands.txt | redis-cli --pipe
redis-cli --pipe
会读取commands.txt
的内容,将其解析为 Redis 命令,构建一个包含这三条命令的管道请求发送给服务器。服务器执行后返回三个响应,redis-cli --pipe
会将这些响应打印出来。 -
--rdb <filename>
:将服务器当前的 RDB 快照文件传输到本地并保存为指定的文件名。需要服务器开启 RDB 持久化。bash
redis-cli --rdb /tmp/dump.rdb -
--slave
:将redis-cli
实例配置为指定 Redis 服务器的从节点(replica)。这主要用于调试和监控主从复制过程。“`bash
redis-cli –slave连接后,它会向服务器发送 PSYNC 命令,开始接收复制流
“`
-
--intrinsic-latency <seconds>
:测量系统本身的“内在延迟”,即没有任何外部干扰时,系统能够达到的最低延迟。这对于评估硬件和操作系统的实时性很有用。“`bash
redis-cli –intrinsic-latency 10运行10秒,报告在此期间测得的最大延迟
“`
-
-c
:启用集群模式(Cluster mode)。当连接到 Redis 集群中的一个节点时,redis-cli
会自动处理命令的重定向(MOVED
或ASK
错误),就像一个支持集群的客户端一样。bash
redis-cli -c -h cluster_node_ip -p cluster_node_port -
-l
:启用循环模式。当连接到 pub/sub 通道时,不会在接收到消息后退出,而是持续监听。通常与SUBSCRIBE
或PSUBSCRIBE
命令一起通过非交互模式使用。“`bash
订阅名为 ‘mychannel’ 的通道并持续监听
redis-cli -l SUBSCRIBE mychannel
“`
这些选项使得 redis-cli
不仅仅是一个简单的命令执行器,更是一个强大的管理、监控和调试工具。
第五章:redis-cli
的常见使用场景与技巧
5.1 快速检查服务器状态
使用 --stat
选项是检查服务器负载、内存、客户端连接等信息最快捷的方式。
bash
redis-cli --stat
5.2 查找键
在开发或维护过程中,经常需要查找符合特定模式的键。使用 --scan
结合 --match
是安全高效的方法:
“`bash
查找所有以 “user:” 开头的键
redis-cli –scan –match “user:*”
查找数据库15中所有以 “session:” 开头的键
redis-cli -n 15 –scan –match “session:*”
“`
5.3 批量删除键
找到要删除的键后,可以使用非交互模式和 xargs
或脚本进行批量删除。
“`bash
查找所有以 “old_data:” 开头的键,并批量删除
redis-cli –scan –match “old_data:*” | xargs redis-cli DEL
``
xargs
**注意:**默认可能会分批执行
DEL` 命令,每次删除多个键。对于非常大量的键,这比逐个删除效率高。但请谨慎使用此操作,确认无误后再执行。
5.4 性能测试与延迟测量
--latency
、--latency-history
和 --latency-dist
选项是诊断网络延迟问题的利器。
“`bash
持续测量延迟
redis-cli –latency
查看延迟分布
redis-cli –latency-dist
“`
你也可以使用 DEBUG COMMANDS
命令(需要 Redis 5.0+)来查看服务器执行命令的时间。
“`bash
在 redis-cli 交互模式下
127.0.0.1:6379> DEBUG YES
OK
127.0.0.1:6379> GET mykey
(1.20ms) “Hello Redis”
127.0.0.1:6379> LPUSH mylist 1 2 3
(0.80ms) (integer) 3
``
DEBUG NO` 关闭调试信息。
输入
5.5 执行管理命令
例如,强制服务器将数据保存到磁盘:
bash
redis-cli SAVE
安全关闭服务器(在无持久化或RDB配置下可能丢失数据,请谨慎):
bash
redis-cli SHUTDOWN
通常推荐使用 SHUTDOWN SAVE
或 SHUTDOWN NOSAVE
。
bash
redis-cli SHUTDOWN SAVE
清空当前数据库或所有数据库(极其危险,请务必谨慎!):
“`bash
清空当前数据库
redis-cli FLUSHDB
清空所有数据库
redis-cli FLUSHALL
“`
5.6 Pub/Sub 消息发布与订阅
在交互模式下,你可以订阅频道:
“`bash
127.0.0.1:6379> SUBSCRIBE news
Reading messages… (press Ctrl-C to quit)
1) “subscribe”
2) “news”
3) (integer) 1
等待消息…
“`
在另一个 redis-cli
窗口发布消息:
bash
redis-cli PUBLISH news "Hello subscribers!"
(integer) 1 # 表示有一人收到了消息
订阅的窗口会收到消息:
bash
1) "message"
2) "news"
3) "Hello subscribers!"
使用 -l
选项可以在非交互模式下持续监听订阅:
bash
redis-cli -l SUBSCRIBE updates
5.7 Pipelining 批量操作
如前所述,--pipe
选项是执行批量操作的强大方式。除了从文件读取命令,你也可以动态生成命令并管道给它:
“`bash
生成100个 SET 命令并管道执行
for i in {1..100}; do echo “SET key_$i value_$i”; done | redis-cli –pipe
“`
第六章:redis-cli
的一些细节与注意事项
6.1 安全性
- 密码: 使用
-a
选项在命令行中传递密码可能不安全,因为它可能暴露在命令历史或进程列表中。更安全的做法是通过配置文件设置密码,或者在交互模式连接成功后使用AUTH password
命令进行认证。Redis 7.0+ 支持 ACL (Access Control List),提供更细粒度的权限控制。 - 网络: 如果通过公网连接远程 Redis 服务器,请确保连接是加密的(例如使用 SSH 隧道或配置 TLS/SSL)。
redis-cli
本身不提供加密连接功能。
6.2 阻塞命令
有些 Redis 命令是阻塞的,例如没有设置超时时间的 BLPOP
、BRPOP
、BZPOPMAX
、BZPOPMIN
、XREAD
等。在 redis-cli
交互模式下执行这些命令会导致客户端一直等待,直到有数据或连接中断。在脚本中尤其要注意,避免脚本被阻塞。
6.3 KEYS
命令的风险
KEYS
命令会遍历数据库中的所有键,在包含大量键的生产环境中执行 KEYS
可能导致服务器阻塞很长时间,影响其他客户端。应优先使用 --scan
选项或 SCAN
命令进行键的查找和迭代。
6.4 redis-cli
并非全能客户端
虽然 redis-cli
功能强大,但它毕竟是一个通用的命令行工具。对于复杂的应用逻辑、高并发访问、连接池管理等,仍应使用各语言成熟的 Redis 客户端库。redis-cli
主要用于开发、测试、管理和调试。
结论
redis-cli
是 Redis 生态中一个强大、灵活且不可或缺的工具。从最基础的连接和命令执行,到高级的性能监控、批量操作和数据传输,它都能胜任。熟练掌握 redis-cli
的使用,不仅能让你更高效地与 Redis 服务器交互,更是深入理解 Redis 工作原理、进行故障排除和性能优化的关键。
无论是初学者探索 Redis 数据结构,还是经验丰富的管理员维护生产环境,redis-cli
都将是你的得力助手。打开你的终端,启动 redis-cli
,开始你的 Redis 探索之旅吧!记住,实践是掌握任何工具的最好方法。
希望本文为你详细地介绍了 redis-cli
的方方面面,帮助你更好地认识和使用这个强大的 Redis 命令行工具。