掌握 redis-cli:Redis 交互式终端必备技巧 – wiki基地


掌握 redis-cli:Redis 交互式终端必备技巧

Redis,作为一款高性能的键值存储系统,广泛应用于缓存、消息队列、排行榜、实时分析等多种场景。而 redis-cli(Redis Command Line Interface)则是与 Redis 服务器进行交互最直接、最常用的工具。无论你是 Redis 的初学者还是经验丰富的开发者,熟练掌握 redis-cli 的各种技巧,都能极大地提升你管理和调试 Redis 的效率。本文将深入探讨 redis-cli 的方方面面,从基础连接到高级应用,助你成为 redis-cli 的使用专家。

一、redis-cli 简介与安装

redis-cli 是 Redis 官方发行包中自带的一个命令行工具,它允许用户向 Redis 服务器发送命令并读取服务器的响应。它通常与 Redis 服务器一同安装。如果你已经安装了 Redis,那么 redis-cli 通常也已经可用。

主要特点:

  1. 交互式模式:可以直接输入 Redis 命令并立即看到结果。
  2. 命令执行模式:可以将命令作为参数直接传递给 redis-cli 执行。
  3. 丰富的功能选项:支持连接远程服务器、密码认证、选择数据库、输出格式化等。
  4. 脚本支持:可以执行 Lua 脚本。
  5. 监控与诊断:提供了诸如 MONITORSLOWLOGLATENCY 等强大的诊断工具。

二、基础连接与常用选项

启动 redis-cli 最简单的方式是在终端直接输入:

bash
redis-cli

默认情况下,它会尝试连接到 127.0.0.1(本机)的 6379 端口。连接成功后,你会看到类似 127.0.0.1:6379> 的提示符。

常用连接选项:

  • -h <hostname>:指定要连接的 Redis 服务器的主机名或 IP 地址。
    bash
    redis-cli -h 192.168.1.100
  • -p <port>:指定要连接的 Redis 服务器的端口号。
    bash
    redis-cli -p 6380
    redis-cli -h my.redis.server -p 6379
  • -a <password>--pass <password>:如果 Redis 服务器设置了密码(通过 requirepass 配置),需要使用此选项进行认证。
    bash
    redis-cli -a "yourpassword"

    如果在连接时未提供密码,但在服务器端设置了密码,后续执行任何命令都会收到 (error) NOAUTH Authentication required. 的错误。此时,可以使用 AUTH <password> 命令进行认证。
    127.0.0.1:6379> AUTH yourpassword
    OK
  • -s <socket>--unixsocket <socket>:通过 Unix 套接字连接,通常在 Redis 服务器与客户端在同一台机器上时使用,性能略优于 TCP/IP 连接。
    bash
    redis-cli -s /tmp/redis.sock
  • -n <dbnum>:选择连接后立即使用的数据库编号(Redis 默认有 16 个数据库,编号从 0 到 15)。
    bash
    redis-cli -n 2

    连接后也可以使用 SELECT <dbnum> 命令切换数据库。
  • --tls:启用 TLS/SSL 加密连接。通常需要配合 --cacert--cert--key 等选项指定证书文件。
    bash
    redis-cli --tls --cacert /path/to/ca.crt --cert /path/to/client.crt --key /path/to/client.key -h my.secure.redis.server
  • --prompt <prompt>:自定义 redis-cli 的提示符。
    bash
    redis-cli --prompt "myredis> "

退出 redis-cli

  • 输入 QUITEXIT
  • 按下 Ctrl+C(某些情况下可能会中断当前命令,再次按下可退出)。

三、基本命令交互

连接到 Redis 后,你可以直接输入 Redis 支持的各种命令。

  • PING:测试与服务器的连接。如果连接正常,服务器会返回 PONG
    127.0.0.1:6379> PING
    PONG
  • 基本数据操作
    • SET key value [EX seconds] [PX milliseconds] [NX|XX]: 设置键值。
      127.0.0.1:6379> SET mykey "Hello Redis"
      OK
      127.0.0.1:6379> SET user:100:name "Alice" EX 3600
      OK
    • GET key: 获取键的值。
      127.0.0.1:6379> GET mykey
      "Hello Redis"
    • DEL key [key ...]: 删除一个或多个键。
      127.0.0.1:6379> DEL mykey
      (integer) 1
    • EXISTS key [key ...]: 判断键是否存在。
      127.0.0.1:6379> EXISTS mykey
      (integer) 0
      127.0.0.1:6379> SET mykey "again"
      OK
      127.0.0.1:6379> EXISTS mykey
      (integer) 1
    • KEYS pattern: 查找所有符合给定模式的键。警告:KEYS 命令会遍历所有键,在生产环境中对大规模数据集使用可能会阻塞服务器,应谨慎使用或使用 SCAN 代替。
      127.0.0.1:6379> SET user:1 "John"
      OK
      127.0.0.1:6379> SET user:2 "Jane"
      OK
      127.0.0.1:6379> KEYS user:*
      1) "user:1"
      2) "user:2"
    • FLUSHDB: 删除当前数据库的所有键。危险操作,请谨慎!
    • FLUSHALL: 删除所有数据库的所有键。极度危险操作,请极度谨慎!

四、redis-cli 进阶技巧

1. 命令历史与自动补全

redis-cli 支持命令历史(通过上下箭头键)和基本的命令自动补全(通过 Tab 键)。这大大提高了输入命令的效率。自动补全不仅能补全命令本身,还能在某些情况下提示命令的参数类型。

2. HELP 命令

redis-cli 内置了强大的帮助系统。

  • HELP @<group>: 列出特定组的命令(如 @string, @list, @hash, @set, @sorted_set, @generic, @server 等)。
    127.0.0.1:6379> HELP @string
    APPEND key value
    summary: Append a value to a key
    since: 2.0.0
    group: string
    ... (更多命令)
  • HELP <commandname>: 显示特定命令的详细用法、参数、复杂度和版本信息。
    “`
    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
    group: string
    … (详细说明)
    “`

3. 输出格式化

  • --raw:当输出包含非 UTF-8 字符或者特殊字符时,redis-cli 默认会进行转义(例如 \x00)。使用 --raw 选项可以禁止这种转义,直接输出原始字节流。这对于处理二进制数据或包含特殊字符的字符串非常有用。
    bash
    # 假设 mybinarykey 存储了二进制数据
    redis-cli --raw GET mybinarykey > output.bin
  • --no-raw:这是默认行为,强制进行 UTF-8 转义。
  • --csv:以 CSV (Comma Separated Values) 格式输出。这对于需要将结果导入到电子表格或其他分析工具的场景非常方便。
    bash
    redis-cli --csv LRANGE mylist 0 -1
    "item1","item2","item3"

4. 执行外部命令文件 (Pipelining)

当需要执行大量命令时,逐条在交互模式下输入会非常低效,并且网络往返开销也大。redis-cli 支持通过管道(pipe)模式批量执行命令,也称为 Pipelining。

创建一个文本文件,例如 commands.txt,每行包含一个 Redis 命令:

SET greeting "Hello"
GET greeting
INCR counter
GET counter

然后通过 shell 管道将文件内容传递给 redis-cli --pipe

bash
cat commands.txt | redis-cli --pipe

或者直接使用 redis-cli --pipe < commands.txt

redis-cli 会一次性将所有命令发送到服务器,然后一次性接收所有响应,大大减少了网络延迟。

  • --pipe-timeout <seconds>:设置管道模式下的超时时间。如果服务器在指定时间内没有响应,操作将失败。

5. 统计模式 (--stat)

--stat 选项可以让 redis-cli 以指定的时间间隔(默认为 1 秒)持续执行 INFO 命令,并以简洁的格式显示关键统计信息,如已连接客户端数、已使用内存、每秒处理命令数等。这对于实时监控 Redis 服务器状态非常有用。

bash
redis-cli --stat
------- data ------ --------------------- load -------------------- - child -
keys mem clients blocked requests connections
5 1.03M 1 0 1 (+0) 7
5 1.03M 1 0 2 (+1) 7
5 1.03M 1 0 3 (+1) 7
...

可以与 -i <interval> (或 --interval <interval>) 结合使用,指定刷新间隔(单位秒,可以为小数)。

bash
redis-cli --stat -i 0.5 # 每 0.5 秒刷新一次

6. 扫描大键 (--bigkeys)

在 Redis 中,少数过大的键(”big keys”)可能会导致性能问题,例如内存分配不均、阻塞操作、迁移困难等。redis-cli --bigkeys 命令可以帮助你找到这些大键。它会使用 SCAN 命令迭代数据库中的所有键,并找出每种数据类型中占用空间最大的键(基于元素数量或字节大小)。

“`bash
redis-cli –bigkeys

Scanning the entire keyspace to find biggest keys as well as

average sizes per key type. You can use -i 0.1 to sleep 0.1 sec

per 100 SCAN commands (not usually needed).

[00.00%] Biggest string found so far ‘user:session:longstring’ with 10240 bytes
[00.00%] Biggest list found so far ‘mylist’ with 10000 items
[00.00%] Biggest hash found so far ‘user:1001’ with 50 fields

——– summary ——-
Sampled 10000 keys in the keyspace!
Total key length in bytes is 238990 (avg len 23.90)

Biggest string found ‘user:session:longstring’ has 10240 bytes
Biggest list found ‘mylist’ has 10000 items
Biggest hash found ‘user:1001’ has 50 fields

5 keys with 10240 bytes (100.00% of string keys)
1 keys with 10000 items (100.00% of list keys)
2 keys with 50 fields (100.00% of hash keys)
``
这对于性能分析和优化非常有帮助。
-i 选项可以在每 100 次SCAN操作后暂停一小段时间(如-i 0.1` 表示暂停 0.1 秒),以减少对生产服务器的性能影响。

7. 延迟监控 (--latency)

网络延迟和命令执行延迟是影响 Redis 性能的关键因素。redis-cli 提供了几种强大的延迟监控工具:

  • --latency: 持续向服务器发送 PING 命令,并实时显示最小、最大、平均延迟。
    bash
    redis-cli --latency
    min: 0, max: 1, avg: 0.18 (1387 samples) -- 1.01 seconds range
    min: 0, max: 1, avg: 0.16 (1432 samples) -- 1.00 seconds range
    ...
  • --latency-history: 与 --latency 类似,但默认每 15 秒(可通过 -i <interval> 修改)输出一次该时间段内的延迟统计。
    bash
    redis-cli --latency-history -i 5 # 每5秒输出一次历史
    min: 0, max: 1, avg: 0.20 (600 samples) -- 5.00 sec
    min: 0, max: 1, avg: 0.15 (700 samples) -- 5.00 sec
  • --latency-dist: 以频谱图的形式显示延迟分布,非常直观。
    bash
    redis-cli --latency-dist
    (output is a graphical distribution)
  • --intrinsic-latency <duration_seconds>: 测量客户端系统本身的固有延迟,即操作系统内核处理事件的延迟。这有助于判断观察到的高延迟是来自网络、Redis 服务器还是客户端本身。
    bash
    redis-cli --intrinsic-latency 5 # 测量5秒
    Min: 3 microseconds
    Max: 192 microseconds
    Avg: 10.23 microseconds (50000 samples)
    Percentage of samples <= 100 microseconds: 99.95%

8. MONITOR 命令

MONITOR 是一个调试命令,它会实时打印出 Redis 服务器接收到的所有命令请求。这对于理解应用程序与 Redis 的交互模式、调试复杂问题或学习 Redis 命令非常有帮助。

redis-cli 中输入 MONITOR

127.0.0.1:6379> MONITOR
OK
1678886400.123456 [0 127.0.0.1:54321] "SET" "mykey" "myvalue"
1678886401.234567 [0 127.0.0.1:54321] "GET" "mykey"
1678886402.345678 [0 127.0.0.1:54322] "INCR" "counter"

每行输出包含时间戳、执行命令的客户端信息(数据库编号、IP 和端口)以及命令本身。
警告:MONITOR 会显著增加服务器的负载,因为它需要将所有命令流式传输给所有监听的客户端。在生产环境中应谨慎使用,并且使用后尽快退出 MONITOR 模式(通过 Ctrl+C)。

9. SLOWLOG 命令

Redis SLOWLOG 用于记录执行时间超过指定阈值的命令。这对于发现和优化慢查询非常有用。

  • SLOWLOG GET [count]: 获取慢查询日志。默认返回最近的 10 条,可以指定数量。
    127.0.0.1:6379> SLOWLOG GET 2
    1) 1) (integer) 14 # 唯一ID
    2) (integer) 1678886500 # 时间戳
    3) (integer) 15230 # 执行耗时 (微秒)
    4) 1) "KEYS" # 命令及参数
    2) "*"
    5) "127.0.0.1:12345" # 客户端地址
    6) "myclient" # 客户端名称 (如果设置了)
    2) ...
  • SLOWLOG LEN: 获取慢查询日志的条目数量。
  • SLOWLOG RESET: 清空慢查询日志。

慢查询的阈值和最大记录数可以通过 Redis 配置文件中的 slowlog-log-slower-than (单位微秒,0 表示记录所有命令) 和 slowlog-max-len 进行配置。也可以通过 CONFIG SET 动态修改(见下文)。

10. INFO 命令

INFO [section] 命令提供了关于 Redis 服务器的大量信息和统计数据。不带参数时,返回所有信息。可以指定 section 来获取特定部分的信息。

常用 section 包括:

  • server: Redis 服务器的一般信息 (版本, OS, 进程ID等)。
  • clients: 客户端连接信息 (已连接数, 最大连接数, 阻塞客户端数等)。
  • memory: 内存消耗信息 (已使用内存,峰值内存, 碎片率, 使用的分配器等)。
  • persistence: RDB 和 AOF 持久化信息。
  • stats: 通用统计信息 (总连接数, 总命令数, QPS, 命中率等)。
  • replication: 主从复制信息。
  • cpu: CPU 消耗统计。
  • commandstats: 各个命令的执行次数、总耗时、平均耗时。
  • cluster: 集群信息 (如果启用了集群)。
  • keyspace: 各个数据库的键数量和过期键数量统计。

“`
127.0.0.1:6379> INFO memory

Memory

used_memory:1073744
used_memory_human:1.02M

``INFO` 命令是监控和诊断 Redis 性能和健康状况的核心工具。

11. CONFIG GETCONFIG SET

这两个命令允许你动态地查看和修改 Redis 服务器的配置参数,而无需重启服务器。

  • CONFIG GET parameter: 获取指定配置参数的值。可以使用 * 通配符。
    127.0.0.1:6379> CONFIG GET loglevel
    1) "loglevel"
    2) "notice"
    127.0.0.1:6379> CONFIG GET slowlog*
    1) "slowlog-log-slower-than"
    2) "10000"
    3) "slowlog-max-len"
    4) "128"
  • CONFIG SET parameter value: 设置配置参数的值。
    127.0.0.1:6379> CONFIG SET loglevel "verbose"
    OK
    127.0.0.1:6379> CONFIG SET slowlog-log-slower-than 5000
    OK

    注意
  • 并非所有配置参数都支持动态修改。
  • 通过 CONFIG SET 修改的配置在 Redis 重启后会丢失,除非同时修改了 redis.conf 文件并执行 CONFIG REWRITE (如果允许) 将当前配置持久化到配置文件。

12. 执行 Lua 脚本 (EVALEVALSHA)

redis-cli 可以用来执行 Lua 脚本,这允许你在服务器端原子地执行复杂逻辑。

  • EVAL script numkeys key [key ...] arg [arg ...]: 执行 Lua 脚本。
    script 是 Lua 脚本字符串。
    numkeys 是脚本中 KEYS 数组的参数数量。
    key [key ...] 是传递给脚本的键名,在脚本中通过 KEYS[i] 访问。
    arg [arg ...] 是传递给脚本的附加参数,在脚本中通过 ARGV[i] 访问。

    lua
    -- 示例脚本:原子地获取一个键的值,如果存在则加1并返回,否则设置为1并返回1
    local val = redis.call('GET', KEYS[1])
    if not val then
    redis.call('SET', KEYS[1], 1)
    return 1
    else
    return redis.call('INCR', KEYS[1])
    end

    redis-cli 中执行:
    127.0.0.1:6379> EVAL "local val = redis.call('GET', KEYS[1]) if not val then redis.call('SET', KEYS[1], 1) return 1 else return redis.call('INCR', KEYS[1]) end" 1 mycounter
    (integer) 1
    127.0.0.1:6379> EVAL "local val = redis.call('GET', KEYS[1]) if not val then redis.call('SET', KEYS[1], 1) return 1 else return redis.call('INCR', KEYS[1]) end" 1 mycounter
    (integer) 2

    * SCRIPT LOAD script: 将脚本加载到 Redis 的脚本缓存中,并返回脚本的 SHA1 校验和。
    * EVALSHA sha1 numkeys key [key ...] arg [arg ...]: 通过 SHA1 校验和执行已缓存的脚本。这样可以避免每次都传输完整的脚本内容,提高效率。
    “`bash
    redis-cli SCRIPT LOAD “return redis.call(‘GET’, KEYS[1])”
    “6b3be736a9e3a0c2aa9099596e0f2406d7100d7c”

    redis-cli EVALSHA 6b3be736a9e3a0c2aa9099596e0f2406d7100d7c 1 mykey
    `redis-cli` 也提供 `--eval <script_path>` 选项来直接执行一个 Lua 脚本文件:bash

    script.lua 内容: return redis.call(‘SET’, KEYS[1], ARGV[1])

    redis-cli –eval script.lua mykey , myvalue # 注意 KEYS 和 ARGV 之间用逗号分隔,KEYS 之间以及 ARGV 之间用空格
    “`

13. SCAN 迭代键空间

如前所述,KEYS * 在大数据集上是危险的。SCAN 命令及其家族 (SSCAN 用于 Set, HSCAN 用于 Hash, ZSCAN 用于 Sorted Set) 提供了更安全、基于游标的迭代方式。

  • SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]:

    • cursor: 初始游标为 0。每次调用 SCAN 会返回一个新的游标,下次调用时传入这个新游标,直到返回的游标为 0 时表示迭代完成。
    • MATCH pattern: 可选,只返回匹配模式的键。
    • COUNT count: 可选,提示服务器每次迭代返回大约多少个元素(不是精确值)。
    • TYPE type: 可选 (Redis 6.0+),只返回指定类型的键 (string, list, set, zset, hash, stream)。

    redis-cli 中手动使用 SCAN
    127.0.0.1:6379> SCAN 0 MATCH user:* COUNT 5
    1) "17" # 下一个游标
    2) 1) "user:2"
    2) "user:1"
    127.0.0.1:6379> SCAN 17 MATCH user:* COUNT 5
    1) "0" # 迭代完成
    2) 1) "user:3"

    redis-cli 也提供了 --scan--pattern 选项来简化 SCAN 操作,它会自动处理游标:
    bash
    redis-cli --scan --pattern "user:*"
    user:2
    user:1
    user:3

14. CLIENT 相关命令

CLIENT 命令组用于管理和查看客户端连接。

  • CLIENT LIST [TYPE normal|master|replica|pubsub]: 列出所有连接的客户端信息。
  • CLIENT INFO: 返回当前连接的客户端信息。
  • CLIENT KILL [ip:port] [ID client-id] ...: 关闭指定的客户端连接。
  • CLIENT SETNAME connection-name: 为当前连接设置一个名称,方便在 CLIENT LISTSLOWLOG 中识别。
  • CLIENT PAUSE timeout (milliseconds): 暂停所有客户端(除了自己和副本)处理命令,持续指定毫秒数。这是一个阻塞命令,用于协调故障转移等场景。危险命令,谨慎使用。

15. 获取远程 RDB 备份 (--rdb <filename>)

redis-cli --rdb <dump_file_name> 可以连接到 Redis 服务器并请求 RDB 持久化文件,将其保存到本地。这实际上是向服务器发送 SYNCPSYNC 命令(取决于版本和上下文),并捕获 RDB 文件流。
bash
redis-cli -h <your-redis-host> -p <port> --rdb backup.rdb

注意:这个操作会触发服务器执行一次 RDB 保存(可能是 BGSAVE),如果服务器正在进行 AOF rewrite 或其他 BGSAVE,可能会有延迟或失败。这个命令在从服务器上执行通常更安全。

五、实用技巧与注意事项

  1. CLEAR 命令:在 redis-cli 交互模式下,输入 CLEAR 可以清屏。
  2. 命令的缩写:许多 Redis 命令有其唯一的前缀即可被识别,例如 CONF 代表 CONFIG。但为了可读性和明确性,建议使用完整命令。
  3. 区分大小写:Redis 命令本身不区分大小写 (如 SETset 等效),但键名 (key) 是区分大小写的。
  4. 引号的使用:当值包含空格或特殊字符时,使用双引号或单引号将其括起来,例如 SET mykey "hello world"。如果值本身包含引号,需要进行适当的转义或使用不同类型的引号。
  5. 生产环境操作
    • 避免在生产环境的主节点上随意使用 KEYS *, FLUSHALL, FLUSHDB, MONITOR, DEBUG 等高风险或高性能影响的命令。
    • 对于 CONFIG SET,务必了解其影响,并考虑是否需要更新配置文件。
    • 执行大规模删除操作时,考虑分批进行,或在业务低峰期操作,并使用 UNLINK (非阻塞删除) 替代 DEL
  6. 连接池与 redis-cliredis-cli 每次执行都是一个独立的连接(除非使用管道)。应用程序中通常使用连接池来复用连接,提高性能。redis-cli 主要用于管理、调试和临时查询。

六、总结

redis-cli 不仅仅是一个简单的命令执行器,它集成了丰富的功能,使其成为 Redis 用户不可或缺的瑞士军刀。从基本的连接和数据操作,到高级的性能监控、诊断、脚本执行和批量操作,熟练运用 redis-cli 的各种选项和内置命令,能够让你更深入地理解 Redis 的工作方式,更高效地管理 Redis 实例,并快速定位和解决问题。

希望通过本文的详细介绍,你能对 redis-cli 有一个全面而深入的认识,并将其技巧灵活运用于日常工作中,让 Redis 为你的应用提供更强大的动力。不断实践和探索 redis-cli 的更多可能性,你将发现它比想象中更为强大。


发表评论

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

滚动至顶部