掌握 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
通常也已经可用。
主要特点:
- 交互式模式:可以直接输入 Redis 命令并立即看到结果。
- 命令执行模式:可以将命令作为参数直接传递给
redis-cli
执行。 - 丰富的功能选项:支持连接远程服务器、密码认证、选择数据库、输出格式化等。
- 脚本支持:可以执行 Lua 脚本。
- 监控与诊断:提供了诸如
MONITOR
、SLOWLOG
、LATENCY
等强大的诊断工具。
二、基础连接与常用选项
启动 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
:
- 输入
QUIT
或EXIT
。 - 按下
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
OKGET key
: 获取键的值。
127.0.0.1:6379> GET mykey
"Hello Redis"DEL key [key ...]
: 删除一个或多个键。
127.0.0.1:6379> DEL mykey
(integer) 1EXISTS 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) 1KEYS 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 SETSET 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 GET
和 CONFIG 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 脚本 (EVAL
和 EVALSHA
)
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 脚本文件:
bashscript.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 LIST
或SLOWLOG
中识别。CLIENT PAUSE timeout (milliseconds)
: 暂停所有客户端(除了自己和副本)处理命令,持续指定毫秒数。这是一个阻塞命令,用于协调故障转移等场景。危险命令,谨慎使用。
15. 获取远程 RDB 备份 (--rdb <filename>
)
redis-cli --rdb <dump_file_name>
可以连接到 Redis 服务器并请求 RDB 持久化文件,将其保存到本地。这实际上是向服务器发送 SYNC
或 PSYNC
命令(取决于版本和上下文),并捕获 RDB 文件流。
bash
redis-cli -h <your-redis-host> -p <port> --rdb backup.rdb
注意:这个操作会触发服务器执行一次 RDB 保存(可能是 BGSAVE
),如果服务器正在进行 AOF rewrite 或其他 BGSAVE
,可能会有延迟或失败。这个命令在从服务器上执行通常更安全。
五、实用技巧与注意事项
CLEAR
命令:在redis-cli
交互模式下,输入CLEAR
可以清屏。- 命令的缩写:许多 Redis 命令有其唯一的前缀即可被识别,例如
CONF
代表CONFIG
。但为了可读性和明确性,建议使用完整命令。 - 区分大小写:Redis 命令本身不区分大小写 (如
SET
和set
等效),但键名 (key) 是区分大小写的。 - 引号的使用:当值包含空格或特殊字符时,使用双引号或单引号将其括起来,例如
SET mykey "hello world"
。如果值本身包含引号,需要进行适当的转义或使用不同类型的引号。 - 生产环境操作:
- 避免在生产环境的主节点上随意使用
KEYS *
,FLUSHALL
,FLUSHDB
,MONITOR
,DEBUG
等高风险或高性能影响的命令。 - 对于
CONFIG SET
,务必了解其影响,并考虑是否需要更新配置文件。 - 执行大规模删除操作时,考虑分批进行,或在业务低峰期操作,并使用
UNLINK
(非阻塞删除) 替代DEL
。
- 避免在生产环境的主节点上随意使用
- 连接池与
redis-cli
:redis-cli
每次执行都是一个独立的连接(除非使用管道)。应用程序中通常使用连接池来复用连接,提高性能。redis-cli
主要用于管理、调试和临时查询。
六、总结
redis-cli
不仅仅是一个简单的命令执行器,它集成了丰富的功能,使其成为 Redis 用户不可或缺的瑞士军刀。从基本的连接和数据操作,到高级的性能监控、诊断、脚本执行和批量操作,熟练运用 redis-cli
的各种选项和内置命令,能够让你更深入地理解 Redis 的工作方式,更高效地管理 Redis 实例,并快速定位和解决问题。
希望通过本文的详细介绍,你能对 redis-cli
有一个全面而深入的认识,并将其技巧灵活运用于日常工作中,让 Redis 为你的应用提供更强大的动力。不断实践和探索 redis-cli
的更多可能性,你将发现它比想象中更为强大。