连接 Redis CLI:详细教程与常见问题
Redis,作为一个高性能的键值对存储系统,因其速度快、功能丰富而广受欢迎。与 Redis 交互的最直接、最强大的方式之一就是通过其自带的命令行客户端:redis-cli
。redis-cli
不仅是一个发送命令的工具,更是管理、调试和学习 Redis 的重要界面。
本文将带你深入了解如何连接到 Redis 服务器的 redis-cli
,从最基本的本地连接到复杂的远程连接、认证和常见问题的排除。无论你是 Redis 的初学者还是经验丰富的开发者或系统管理员,本文都将为你提供全面的指导。
第一部分:理解 redis-cli
在深入连接细节之前,我们先了解一下 redis-cli
是什么以及为什么我们需要使用它。
什么是 redis-cli
?
redis-cli
是 Redis 官方提供的命令行接口工具。它是 Redis 服务器安装包的一部分,通常与 Redis 服务器一起安装在你的系统上。它是一个简单的程序,用于连接 Redis 服务器,发送 Redis 命令,并接收服务器的响应。
为什么使用 redis-cli
?
使用 redis-cli
的场景非常广泛:
- 管理和维护: 执行服务器管理命令,如
INFO
(查看服务器信息)、MONITOR
(实时监控命令)、SHUTDOWN
(关闭服务器) 等。 - 开发和调试: 测试 Redis 命令的行为、调试数据结构、检查键值对是否存在等。
- 学习和实验: 学习 Redis 命令的最佳途径,可以实时看到每个命令的输出。
- 自动化脚本:
redis-cli
也可以在非交互模式下使用,方便编写自动化脚本来执行 Redis 命令。
总而言之,掌握 redis-cli
的连接和使用是掌握 Redis 的基础。
第二部分:连接 redis-cli
的基本方法
连接 redis-cli
的方法取决于 Redis 服务器运行的位置以及你是否需要特定的配置(如密码、端口、数据库)。
2.1 最简单的连接:本地默认连接
如果你在本地机器上安装了 Redis 服务器,并且它运行在默认端口 6379 上,没有设置密码,那么连接是最简单的。
- 打开终端或命令提示符: 在你的操作系统中打开一个终端窗口(Linux/macOS)或命令提示符/PowerShell(Windows)。
-
输入
redis-cli
命令:bash
redis-cli -
按回车键。
如果一切顺利,你会看到类似以下的输出,表示成功连接到 Redis 服务器:
127.0.0.1:6379>
这个提示符 127.0.0.1:6379>
表示你已经成功连接到本地主机(127.0.0.1)上运行在端口 6379 的 Redis 服务器。现在你可以在提示符后输入 Redis 命令了,例如输入 PING
并按回车,服务器应该返回 PONG
。
bash
127.0.0.1:6379> PING
PONG
127.0.0.1:6379>
2.2 连接到指定的 IP 地址和端口
大多数情况下,你可能需要连接到不是本地主机或不是运行在默认端口 6379 的 Redis 服务器。你需要使用 -h
和 -p
选项来指定主机和端口。
-h <hostname or IP>
:指定 Redis 服务器的主机名或 IP 地址。-p <port>
:指定 Redis 服务器的端口号。
例如,要连接到 IP 地址为 192.168.1.100
、端口为 6380
的 Redis 服务器:
- 打开终端。
-
输入带选项的
redis-cli
命令:bash
redis-cli -h 192.168.1.100 -p 6380 -
按回车键。
如果连接成功,提示符将反映你连接的主机和端口:
192.168.1.100:6380>
重要提示: 要通过网络连接到远程 Redis 服务器,需要确保:
* 远程服务器上的 Redis 服务正在运行。
* 远程服务器的防火墙允许来自你当前机器的连接,通常需要开放 Redis 监听的端口(默认为 6379)。
* Redis 服务器的配置允许外部连接(检查 redis.conf
文件中的 bind
指令,默认为 127.0.0.1
,需要修改为服务器 IP 或 0.0.0.0
才能允许所有地址连接,但 0.0.0.0
不安全,最好指定允许连接的 IP 地址)。
2.3 使用密码进行身份验证
如果你的 Redis 服务器设置了密码(通过 requirepass
指令在 redis.conf
文件中配置),你需要在连接时提供密码进行身份验证。有两种主要方法:
-
使用
-a
选项在连接时提供密码: 这是最常见的方法。-a <password>
:指定连接 Redis 服务器所需的密码。
例如,连接到
192.168.1.100:6379
,密码为mypassword
:bash
redis-cli -h 192.168.1.100 -p 6379 -a mypassword如果密码正确且连接成功,你会直接进入提示符。
192.168.1.100:6379>
安全性考虑: 在命令行直接输入密码可能会被系统的进程列表或其他用户看到,存在一定的安全风险。在生产环境中,尤其是在共享或不安全的系统上,应谨慎使用
-a
选项。 -
连接后再使用
AUTH
命令进行身份验证: 如果你不想在命令行中输入密码,或者先连接上再决定认证(例如,如果你连接的服务器不需要密码,但某个操作需要),可以在连接后使用AUTH
命令。首先,像没有密码一样连接(假设服务器允许未认证连接,尽管通常设置密码后就不允许了,但某些配置下可能允许部分命令):
bash
redis-cli -h 192.168.1.100 -p 6379连接后,服务器可能会返回
NOAUTH Authentication required.
或者在你尝试执行命令时返回此错误。此时,输入AUTH
命令和密码:bash
192.0.0.1:6379> AUTH mypassword
OK如果密码正确,服务器返回
OK
,表示认证成功,现在你可以执行其他 Redis 命令了。如果密码错误,服务器将返回错误信息。
2.4 连接到指定的数据库
Redis 默认支持多个逻辑数据库,编号从 0 到 15 (可以通过 databases
配置项修改数量)。默认连接到数据库 0。你可以使用 -n
选项在连接时指定要使用的数据库编号。
-n <db_number>
:指定连接后自动选择的数据库编号。数据库编号通常从 0 开始。
例如,连接到本地 Redis 服务器的数据库 5:
bash
redis-cli -n 5
连接成功后,提示符可能会显示当前数据库编号(取决于 redis-cli
版本和配置):
127.0.0.1:6379[5]>
或者你可以在连接后使用 SELECT <db_number>
命令切换数据库:
bash
127.0.0.1:6379> SELECT 5
OK
127.0.0.1:6379[5]>
第三部分:更高级的连接方法
除了基本的 TCP/IP 连接,redis-cli
还支持其他连接方式和高级选项。
3.1 使用 Unix 域套接字连接
在类 Unix 系统(如 Linux、macOS)上,如果 Redis 服务器和客户端运行在同一台机器上,可以使用 Unix 域套接字(Unix Domain Socket,UDS)进行连接,而不是通过 TCP/IP。UDS 通常比 TCP/IP 连接更快,因为它绕过了网络协议栈。
要使用 UDS 连接,Redis 服务器需要在配置文件中启用 unixsocket
选项,并指定套接字文件的路径。例如:
unixsocket /var/run/redis/redis.sock
unixsocketperm 777 # 设置套接字文件权限 (可选)
然后,你可以使用 -s
选项指定套接字文件的路径来连接:
-s <socket_path>
:指定 Redis 服务器使用的 Unix 域套接字文件路径。
例如,连接到 /var/run/redis/redis.sock
文件:
bash
redis-cli -s /var/run/redis/redis.sock
如果连接成功,提示符可能会显示套接字路径:
/var/run/redis/redis.sock>
请注意,使用 -h
和 -p
选项时是 TCP/IP 连接,使用 -s
选项时是 Unix 域套接字连接。这两者是互斥的,你不能同时使用 -h
/-p
和 -s
。
3.2 使用 TLS/SSL 连接
对于需要在不安全网络上传输敏感数据的场景,Redis 支持 TLS/SSL 加密连接(需要 Redis 版本 6.0 或更高,并且编译时包含 TLS 支持)。如果你的 Redis 服务器配置为使用 TLS,那么 redis-cli
也需要配置为使用 TLS 连接。
redis-cli
提供了 --tls
选项来启用 TLS 连接,以及其他选项来指定证书文件等:
--tls
: 启用 TLS 连接。--cacert <cert>
: 指定 CA 证书文件路径,用于验证服务器证书。--cert <cert>
: 指定客户端证书文件路径(如果服务器要求客户端证书)。--key <key>
: 指定客户端私钥文件路径(与--cert
一起使用)。--tls-verify
: 强制进行服务器证书验证(默认是关闭的,强烈建议开启)。
例如,连接到启用 TLS 的服务器,并使用 CA 证书进行验证:
bash
redis-cli -h my.redisserver.com -p 6379 --tls --tls-verify --cacert /path/to/ca.crt
TLS 连接的配置相对复杂,涉及到证书的生成和管理,这超出了本文的基本连接范围。但了解 redis-cli
支持这些选项很重要。
3.3 连接到 Redis Cluster
Redis Cluster 是 Redis 的分布式实现。redis-cli
可以以集群模式连接到集群中的 任何一个节点。一旦连接到节点,redis-cli
会自动获取集群的拓扑信息,并能够将命令路由到正确的节点。
要以集群模式连接,使用 -c
选项:
-c
: 启用集群模式。
例如,连接到集群中一个节点的地址 192.168.1.200:7000
:
bash
redis-cli -c -h 192.168.1.200 -p 7000
在集群模式下,当你执行一个需要路由到其他节点的命令时,redis-cli
会显示一个重定向信息(-> Redirected to ...
),然后自动连接到正确的节点执行命令。
bash
192.168.1.200:7000> SET mykey myvalue
-> Redirected to 192.168.1.201:7001
192.168.1.201:7001> OK
192.168.1.201:7001> GET mykey
"myvalue"
192.168.1.201:7001>
3.4 连接到 Redis Sentinel
Redis Sentinel 是 Redis 的高可用性解决方案。你可以连接到 Sentinel 实例来监控 Redis 主从实例的状态,执行故障转移等。
连接到 Sentinel 实例与连接普通的 Redis 实例类似,指定 Sentinel 的 IP 和端口即可。Sentinel 默认端口是 26379。
bash
redis-cli -h 192.168.1.300 -p 26379
连接到 Sentinel 后,你可以执行 Sentinel 相关的命令,例如 SENTINEL masters
查看所有被监控的主节点。
你也可以使用 redis-cli
作为 Sentinel 的客户端来查找当前某个主节点的地址,特别是当你不知道当前哪个是主节点时。使用 --sentinel
选项:
bash
redis-cli --sentinel -h <sentinel_host> -p <sentinel_port> get-master-addr-by-name <master_name>
例如:
bash
redis-cli --sentinel -h 192.168.1.300 -p 26379 get-master-addr-by-name mymaster
这将返回当前名为 mymaster
的主节点的 IP 和端口。
第四部分:连接到 Redis 的不同环境
Redis 可能运行在各种环境中:本地开发机、远程物理服务器、虚拟机、Docker 容器、Kubernetes Pods,或者云服务提供商的托管服务。连接方法的核心原理不变(指定主机、端口、密码等),但具体的执行方式略有不同。
4.1 从本地连接到远程服务器
这正是前面 -h
和 -p
选项的典型应用场景。确保你的本地机器可以访问远程服务器的网络地址,并且服务器防火墙允许连接。
4.2 从远程服务器本机连接
如果你已经通过 SSH 等方式登录到了运行 Redis 的服务器上,那么连接就是本地连接,通常只需输入 redis-cli
即可,或者使用 -p
指定非默认端口。
4.3 连接到 Docker 容器中的 Redis
如果 Redis 运行在 Docker 容器中,有几种连接方式:
-
如果容器端口映射到宿主机: 如果你在运行容器时将 Redis 端口映射到了宿主机的某个端口(例如
-p 6379:6379
),那么从宿主机或其他机器连接时,就像连接到宿主机上的普通服务一样,使用宿主机的 IP 和映射的端口。bash
redis-cli -h <宿主机IP> -p <映射端口> -
从宿主机直接进入容器内部连接: 你可以使用
docker exec
命令在运行中的容器内执行redis-cli
。这是最安全的方式,因为它不需要暴露容器端口到外部。首先,找到 Redis 容器的 ID 或名称:
docker ps
然后,执行
redis-cli
命令:bash
docker exec -it <容器ID或名称> redis-cli这将在容器内部启动
redis-cli
,并自动连接到容器内部的 Redis 服务器(通常是本地连接)。 -
如果容器在自定义 Docker 网络中: 如果你的应用和 Redis 容器在同一个自定义 Docker 网络中,应用容器通常可以使用 Redis 容器的服务名称作为主机名直接连接,而无需端口映射到宿主机。从外部连接则需要端口映射或进入容器内部。
4.4 连接到云服务提供商的 Redis (例如 AWS ElastiCache, Azure Cache, GCP MemoryStore)
云服务提供商通常提供托管的 Redis 服务。连接这些服务通常涉及:
- 获取连接信息: 从云服务控制台获取 Redis 实例的终端节点(Endpoint/Hostname)和端口号。
- 安全组/防火墙配置: 配置云服务提供商的安全组或防火墙规则,允许你的客户端机器的 IP 地址或 IP 范围访问 Redis 实例的端口。
- 身份验证: 云服务通常强制使用密码进行身份验证。获取 Redis 实例的密码。
-
使用
redis-cli
连接: 使用获取的终端节点、端口和密码进行连接,就像连接任何远程服务器一样。bash
redis-cli -h <云服务终端节点> -p <端口> -a <密码>注意: 某些云服务可能支持或强制使用 TLS 连接,此时你需要使用
--tls
等相关选项。
第五部分:redis-cli
的其他有用选项
除了连接相关的选项,redis-cli
还有一些其他实用的选项:
-r <count>
: 重复执行命令的次数。例如redis-cli -r 10 PING
会执行 10 次 PING。-i <interval>
: 重复执行命令时的时间间隔(秒)。例如redis-cli -r 10 -i 1 INFO
会每秒执行一次 INFO 命令,共 10 次。--raw
: 以原始格式输出响应,不进行美化和格式化,方便脚本解析。--no-raw
: 默认行为,对输出进行美化。--stat
: 进入统计模式,周期性地显示 Redis 的统计信息,类似于INFO server
和INFO memory
的摘要。--latency
: 进入延迟检测模式,测量 Redis 响应延迟。--latency-history
: 周期性地采样并显示延迟历史。--latency-dist
: 显示延迟的分布直方图。--scan
: 使用SCAN
命令迭代数据库中的键,而不是危险的KEYS
命令。可以与-pattern <pattern>
一起使用。--iterators
: 在--scan
或其他迭代命令时显示进度。--slave
: 模拟一个只读副本连接到主节点。--intrinsic-latency <seconds>
: 测量系统本身的延迟,用于判断 Redis 性能问题是否由系统延迟引起。
这些选项提供了更灵活和强大的 redis-cli
使用方式,特别是在性能分析和故障排查时非常有用。
第六部分:redis-cli
连接常见问题与故障排除
连接 Redis CLI 时可能会遇到各种问题。以下是一些最常见的问题及其排除方法:
6.1 错误: Could not connect to Redis at 127.0.0.1:6379: Connection refused
原因: 这是最常见的连接错误,意味着客户端尝试连接服务器但被拒绝了。可能的原因包括:
1. Redis 服务器未运行: Redis 服务没有启动或已经崩溃。
2. Redis 服务器配置错误: Redis 配置为监听非默认地址或端口,或者绑定了错误的 IP。
3. 防火墙阻止连接: 服务器或客户端机器的防火墙阻止了到 Redis 端口的连接。
4. 网络问题: 客户端无法通过网络到达服务器地址。
排除方法:
- 检查 Redis 服务器状态:
- 在服务器上,使用命令检查 Redis 进程是否正在运行:
- Linux/macOS:
ps aux | grep redis-server
或systemctl status redis
(如果使用 systemd) - Windows: 在任务管理器中查找
redis-server.exe
进程。
- Linux/macOS:
- 如果服务未运行,尝试启动它。
- 在服务器上,使用命令检查 Redis 进程是否正在运行:
- 检查 Redis 配置文件 (
redis.conf
):- 查找
bind
指令:它指定了 Redis 监听的 IP 地址。bind 127.0.0.1
只允许本地连接。bind <服务器IP>
只允许特定 IP 连接。bind 0.0.0.0
允许所有地址连接(不推荐)。确保客户端尝试连接的 IP 在服务器的bind
列表中。 - 查找
port
指令:确保redis-cli -p
指定的端口与配置文件中的端口一致。 - 查找
protected-mode yes
:如果bind
指令不是127.0.0.1
且没有设置密码,protected-mode yes
会阻止外部连接。可以设置为no
(不安全) 或设置密码。
- 查找
- 检查防火墙:
- 服务器端防火墙: 确保服务器的防火墙(如
iptables
,firewalld
, Windows Firewall, 云服务安全组等)允许来自客户端 IP 的 Redis 端口(默认为 6379)的入站连接。 - 客户端端防火墙: 确保客户端的防火墙允许到服务器 Redis 端口的出站连接(通常不是问题,但值得检查)。
- 服务器端防火墙: 确保服务器的防火墙(如
- 检查网络连通性:
- 使用
ping <服务器IP>
检查客户端是否能与服务器通信。 - 使用
telnet <服务器IP> <端口>
或nc <服务器IP> <端口>
检查能否建立到 Redis 端口的 TCP 连接。如果 telnet/nc 命令能连接上(屏幕变空白或显示一些奇怪字符),说明网络和端口是通的;如果连接被拒绝或超时,则可能是防火墙或服务器未监听该端口的问题。
- 使用
6.2 错误: NOAUTH Authentication required.
原因: 你尝试执行需要认证的命令,但你没有提供正确的密码,或者根本没有提供密码。
排除方法:
- 检查 Redis 配置文件 (
redis.conf
): 查找requirepass
指令。确认 Redis 是否设置了密码,以及密码是什么。 - 使用
-a
选项连接: 在redis-cli
命令中加上-a <password>
选项,使用正确的密码进行连接。 - 连接后使用
AUTH
命令: 如果已经连接(服务器允许未认证连接或你先不提供密码),在redis-cli
提示符下输入AUTH <password>
命令。 - 确认密码是否正确: 小心地输入或复制粘贴密码,确保没有输错。
6.3 错误: (error) ERR unknown command '...'
原因: 你输入的命令 Redis 服务器无法识别。
排除方法:
- 检查命令拼写: 确保你输入的 Redis 命令拼写正确。Redis 命令是大小写不敏感的,但参数通常是大小写敏感的。
- 检查 Redis 版本: 某些命令是特定 Redis 版本后才引入的。检查你连接的 Redis 服务器版本 (
INFO server
命令的redis_version
字段) 是否支持该命令。 - 检查服务器配置: 某些命令(如
FLUSHALL
,DEBUG
等)可能会被服务器配置禁用或重命名。检查redis.conf
中的rename-command
配置。
6.4 错误: (error) WRONGTYPE Operation against a key holding the wrong kind of value
原因: 你尝试对一个键执行一个不适用于其存储数据类型的操作(例如,对一个 String 类型的键执行 List 操作 LPUSH
)。虽然这不是一个连接错误,但它是一个常见的与 redis-cli
交互时遇到的错误。
排除方法:
- 检查键的数据类型: 使用
TYPE <key>
命令查看键存储的数据类型。 - 使用正确的命令: 根据键的数据类型,使用相应的命令进行操作(例如,对 List 使用
LPUSH
/RPUSH
/LRANGE
,对 Hash 使用HSET
/HGETALL
等)。
6.5 连接超时
原因: 客户端尝试连接服务器,但在指定的时间内没有得到响应。可能的原因与 Connection refused
类似,但更倾向于网络延迟、服务器负载过高导致无法及时响应,或者防火墙丢弃了连接请求但没有返回拒绝报文。
排除方法:
- 检查网络连通性和延迟: 使用
ping
检查网络延迟。高延迟或丢包可能导致连接超时。 - 检查服务器负载: 使用
INFO server
命令(如果能连上)或系统监控工具检查 Redis 服务器的 CPU、内存、网络使用率。服务器过载可能导致无法处理新的连接请求。 - 检查服务器和客户端的防火墙: 确保没有任何规则导致连接超时。有时防火墙会默默地丢弃报文而不是返回拒绝。
- 调整客户端连接超时时间:
redis-cli
默认有连接超时时间,但一般不需要调整。如果问题依然存在,很可能是服务器或网络端的问题。
6.6 -a
选项泄露密码
原因: 在命令行中直接使用 -a <password>
选项,密码可能会保留在 shell 历史记录中,或者通过 ps aux
等命令被其他用户看到。
解决方案:
- 避免在共享系统上使用
-a
: 如果在生产环境或共享服务器上连接,优先使用AUTH
命令在连接后手动输入密码。 - 清理 shell 历史记录: 连接后立即清理相关的历史记录。
- 使用更安全的认证方式: 考虑使用 TLS/SSL 加密连接并结合证书认证,或者使用 Redis 6 引入的 ACL (Access Control List) 进行更精细的权限管理。
第七部分:退出 redis-cli
当你完成操作后,有几种方式可以退出 redis-cli
的交互模式:
- 输入
exit
并按回车。 - 输入
quit
并按回车。 - 按下
Ctrl + C
。
选择其中任何一种方式都会关闭与 Redis 服务器的连接并退出 redis-cli
程序。
第八部分:总结
redis-cli
是与 Redis 服务器交互不可或缺的工具。本文详细介绍了连接 redis-cli
的各种方法:
- 本地默认连接:
redis-cli
- 指定主机和端口:
redis-cli -h <host> -p <port>
- 使用密码认证:
redis-cli -a <password>
或连接后使用AUTH
命令。 - 选择数据库:
redis-cli -n <db_number>
或连接后使用SELECT
命令。 - 使用 Unix 域套接字:
redis-cli -s <socket_path>
- 高级连接: TLS (
--tls
), 集群 (-c
), Sentinel (--sentinel
). - 不同环境下的连接: 本地、远程、Docker、云服务。
同时,本文也深入分析了连接过程中可能遇到的常见问题,如连接被拒绝、认证失败等,并提供了详细的故障排除步骤。
熟练掌握 redis-cli
的连接和使用,将极大地提高你在 Redis 开发、管理和维护方面的效率。从简单的键值操作到复杂的集群管理和性能分析,redis-cli
都是你的得力助手。开始你的 Redis CLI 之旅吧!