如何连接 Redis CLI:详细教程与常见问题 – wiki基地


连接 Redis CLI:详细教程与常见问题

Redis,作为一个高性能的键值对存储系统,因其速度快、功能丰富而广受欢迎。与 Redis 交互的最直接、最强大的方式之一就是通过其自带的命令行客户端:redis-cliredis-cli 不仅是一个发送命令的工具,更是管理、调试和学习 Redis 的重要界面。

本文将带你深入了解如何连接到 Redis 服务器的 redis-cli,从最基本的本地连接到复杂的远程连接、认证和常见问题的排除。无论你是 Redis 的初学者还是经验丰富的开发者或系统管理员,本文都将为你提供全面的指导。

第一部分:理解 redis-cli

在深入连接细节之前,我们先了解一下 redis-cli 是什么以及为什么我们需要使用它。

什么是 redis-cli

redis-cli 是 Redis 官方提供的命令行接口工具。它是 Redis 服务器安装包的一部分,通常与 Redis 服务器一起安装在你的系统上。它是一个简单的程序,用于连接 Redis 服务器,发送 Redis 命令,并接收服务器的响应。

为什么使用 redis-cli

使用 redis-cli 的场景非常广泛:

  1. 管理和维护: 执行服务器管理命令,如 INFO (查看服务器信息)、MONITOR (实时监控命令)、SHUTDOWN (关闭服务器) 等。
  2. 开发和调试: 测试 Redis 命令的行为、调试数据结构、检查键值对是否存在等。
  3. 学习和实验: 学习 Redis 命令的最佳途径,可以实时看到每个命令的输出。
  4. 自动化脚本: redis-cli 也可以在非交互模式下使用,方便编写自动化脚本来执行 Redis 命令。

总而言之,掌握 redis-cli 的连接和使用是掌握 Redis 的基础。

第二部分:连接 redis-cli 的基本方法

连接 redis-cli 的方法取决于 Redis 服务器运行的位置以及你是否需要特定的配置(如密码、端口、数据库)。

2.1 最简单的连接:本地默认连接

如果你在本地机器上安装了 Redis 服务器,并且它运行在默认端口 6379 上,没有设置密码,那么连接是最简单的。

  1. 打开终端或命令提示符: 在你的操作系统中打开一个终端窗口(Linux/macOS)或命令提示符/PowerShell(Windows)。
  2. 输入 redis-cli 命令:

    bash
    redis-cli

  3. 按回车键。

如果一切顺利,你会看到类似以下的输出,表示成功连接到 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 服务器:

  1. 打开终端。
  2. 输入带选项的 redis-cli 命令:

    bash
    redis-cli -h 192.168.1.100 -p 6380

  3. 按回车键。

如果连接成功,提示符将反映你连接的主机和端口:

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 文件中配置),你需要在连接时提供密码进行身份验证。有两种主要方法:

  1. 使用 -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 选项。

  2. 连接后再使用 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 容器中,有几种连接方式:

  1. 如果容器端口映射到宿主机: 如果你在运行容器时将 Redis 端口映射到了宿主机的某个端口(例如 -p 6379:6379),那么从宿主机或其他机器连接时,就像连接到宿主机上的普通服务一样,使用宿主机的 IP 和映射的端口。

    bash
    redis-cli -h <宿主机IP> -p <映射端口>

  2. 从宿主机直接进入容器内部连接: 你可以使用 docker exec 命令在运行中的容器内执行 redis-cli。这是最安全的方式,因为它不需要暴露容器端口到外部。

    首先,找到 Redis 容器的 ID 或名称:docker ps

    然后,执行 redis-cli 命令:

    bash
    docker exec -it <容器ID或名称> redis-cli

    这将在容器内部启动 redis-cli,并自动连接到容器内部的 Redis 服务器(通常是本地连接)。

  3. 如果容器在自定义 Docker 网络中: 如果你的应用和 Redis 容器在同一个自定义 Docker 网络中,应用容器通常可以使用 Redis 容器的服务名称作为主机名直接连接,而无需端口映射到宿主机。从外部连接则需要端口映射或进入容器内部。

4.4 连接到云服务提供商的 Redis (例如 AWS ElastiCache, Azure Cache, GCP MemoryStore)

云服务提供商通常提供托管的 Redis 服务。连接这些服务通常涉及:

  1. 获取连接信息: 从云服务控制台获取 Redis 实例的终端节点(Endpoint/Hostname)和端口号。
  2. 安全组/防火墙配置: 配置云服务提供商的安全组或防火墙规则,允许你的客户端机器的 IP 地址或 IP 范围访问 Redis 实例的端口。
  3. 身份验证: 云服务通常强制使用密码进行身份验证。获取 Redis 实例的密码。
  4. 使用 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 serverINFO 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. 网络问题: 客户端无法通过网络到达服务器地址。

排除方法:

  1. 检查 Redis 服务器状态:
    • 在服务器上,使用命令检查 Redis 进程是否正在运行:
      • Linux/macOS: ps aux | grep redis-serversystemctl status redis (如果使用 systemd)
      • Windows: 在任务管理器中查找 redis-server.exe 进程。
    • 如果服务未运行,尝试启动它。
  2. 检查 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 (不安全) 或设置密码。
  3. 检查防火墙:
    • 服务器端防火墙: 确保服务器的防火墙(如 iptables, firewalld, Windows Firewall, 云服务安全组等)允许来自客户端 IP 的 Redis 端口(默认为 6379)的入站连接。
    • 客户端端防火墙: 确保客户端的防火墙允许到服务器 Redis 端口的出站连接(通常不是问题,但值得检查)。
  4. 检查网络连通性:
    • 使用 ping <服务器IP> 检查客户端是否能与服务器通信。
    • 使用 telnet <服务器IP> <端口>nc <服务器IP> <端口> 检查能否建立到 Redis 端口的 TCP 连接。如果 telnet/nc 命令能连接上(屏幕变空白或显示一些奇怪字符),说明网络和端口是通的;如果连接被拒绝或超时,则可能是防火墙或服务器未监听该端口的问题。

6.2 错误: NOAUTH Authentication required.

原因: 你尝试执行需要认证的命令,但你没有提供正确的密码,或者根本没有提供密码。

排除方法:

  1. 检查 Redis 配置文件 (redis.conf): 查找 requirepass 指令。确认 Redis 是否设置了密码,以及密码是什么。
  2. 使用 -a 选项连接:redis-cli 命令中加上 -a <password> 选项,使用正确的密码进行连接。
  3. 连接后使用 AUTH 命令: 如果已经连接(服务器允许未认证连接或你先不提供密码),在 redis-cli 提示符下输入 AUTH <password> 命令。
  4. 确认密码是否正确: 小心地输入或复制粘贴密码,确保没有输错。

6.3 错误: (error) ERR unknown command '...'

原因: 你输入的命令 Redis 服务器无法识别。

排除方法:

  1. 检查命令拼写: 确保你输入的 Redis 命令拼写正确。Redis 命令是大小写不敏感的,但参数通常是大小写敏感的。
  2. 检查 Redis 版本: 某些命令是特定 Redis 版本后才引入的。检查你连接的 Redis 服务器版本 (INFO server 命令的 redis_version 字段) 是否支持该命令。
  3. 检查服务器配置: 某些命令(如 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 交互时遇到的错误。

排除方法:

  1. 检查键的数据类型: 使用 TYPE <key> 命令查看键存储的数据类型。
  2. 使用正确的命令: 根据键的数据类型,使用相应的命令进行操作(例如,对 List 使用 LPUSH/RPUSH/LRANGE,对 Hash 使用 HSET/HGETALL 等)。

6.5 连接超时

原因: 客户端尝试连接服务器,但在指定的时间内没有得到响应。可能的原因与 Connection refused 类似,但更倾向于网络延迟、服务器负载过高导致无法及时响应,或者防火墙丢弃了连接请求但没有返回拒绝报文。

排除方法:

  1. 检查网络连通性和延迟: 使用 ping 检查网络延迟。高延迟或丢包可能导致连接超时。
  2. 检查服务器负载: 使用 INFO server 命令(如果能连上)或系统监控工具检查 Redis 服务器的 CPU、内存、网络使用率。服务器过载可能导致无法处理新的连接请求。
  3. 检查服务器和客户端的防火墙: 确保没有任何规则导致连接超时。有时防火墙会默默地丢弃报文而不是返回拒绝。
  4. 调整客户端连接超时时间: redis-cli 默认有连接超时时间,但一般不需要调整。如果问题依然存在,很可能是服务器或网络端的问题。

6.6 -a 选项泄露密码

原因: 在命令行中直接使用 -a <password> 选项,密码可能会保留在 shell 历史记录中,或者通过 ps aux 等命令被其他用户看到。

解决方案:

  1. 避免在共享系统上使用 -a 如果在生产环境或共享服务器上连接,优先使用 AUTH 命令在连接后手动输入密码。
  2. 清理 shell 历史记录: 连接后立即清理相关的历史记录。
  3. 使用更安全的认证方式: 考虑使用 TLS/SSL 加密连接并结合证书认证,或者使用 Redis 6 引入的 ACL (Access Control List) 进行更精细的权限管理。

第七部分:退出 redis-cli

当你完成操作后,有几种方式可以退出 redis-cli 的交互模式:

  1. 输入 exit 并按回车。
  2. 输入 quit 并按回车。
  3. 按下 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 之旅吧!


发表评论

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

滚动至顶部