【Redis 基础】认识和使用 redis-cli – wiki基地


【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-cliINFODBSIZECLIENT LIST 等命令能立刻给你答案。
  • 管理任务: 执行 SHUTDOWNSAVEBGSAVEFLUSHALL 等管理命令,通常通过 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 中直接显示,如 OKPONG
  • 错误 (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 退出交互模式

输入 QUITEXIT 命令,或者按下 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-cliredis-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 会自动处理命令的重定向(MOVEDASK 错误),就像一个支持集群的客户端一样。

    bash
    redis-cli -c -h cluster_node_ip -p cluster_node_port

  • -l:启用循环模式。当连接到 pub/sub 通道时,不会在接收到消息后退出,而是持续监听。通常与 SUBSCRIBEPSUBSCRIBE 命令一起通过非交互模式使用。

    “`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 SAVESHUTDOWN 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 命令是阻塞的,例如没有设置超时时间的 BLPOPBRPOPBZPOPMAXBZPOPMINXREAD 等。在 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 命令行工具。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部