redis-cli 命令详解:从连接到高阶实战
redis-cli 是 Redis 官方提供的命令行客户端,是与 Redis 实例交互最直接、最灵活的工具。它既可以在命令行模式下直接执行单条命令后退出,也可以进入交互式 REPL 模式进行连续操作,还提供了监控、延迟分析、键空间扫描、数据导入导出等特殊模式。下面从连接、数据类型操作到高阶技巧,系统梳理 redis-cli 的核心用法。
一、连接 Redis:从本地到远程
默认情况下,redis-cli 连接 127.0.0.1 的 6379 端口。在本地开发环境中,直接输入 redis-cli 即可进入交互模式。
连接远程或受保护的实例时,常用参数如下:
| 参数 | 作用 | 示例 |
|---|---|---|
-h |
指定主机名或 IP 地址 | redis-cli -h 192.168.1.100 |
-p |
指定端口号,默认 6379 | redis-cli -p 6380 |
-a |
提供密码进行认证 | redis-cli -a mypassword |
-n |
选择数据库编号(0-15) | redis-cli -n 2 |
-c |
连接 Cluster 集群时启用重定向 | redis-cli -c -h node1 -p 6379 |
--tls |
启用 SSL/TLS 加密连接 | redis-cli --tls -h host -p 6380 |
连接 Cluster 集群时,必须加上 -c 参数,否则命令无法正确路由到目标节点。此外,也可以使用 URI 格式一次性传入连接信息:
bash
redis-cli -u redis://username:password@host:6379
安全提示 :在生产环境中不要在命令行中通过
-a直接传递密码,因为密码会出现在 shell 历史和进程列表中。推荐使用REDISCLI_AUTH环境变量来自动向 redis-cli 提供密码。
二、五大核心数据类型的命令速查
Redis 支持 String、List、Hash、Set、ZSet 五种核心数据类型。redis-cli 在交互模式下提供 Tab 补全和命令历史,输入命令后按回车即可执行并查看类型化回复。
2.1 String(字符串)
String 是最基础的类型,适合缓存、计数器、分布式锁等场景。
bash
SET mykey "Hello" # 设置键值,O(1)
GET mykey # 获取值,键不存在返回 nil
MSET k1 v1 k2 v2 # 原子批量设置
MGET k1 k2 k3 # 批量获取
INCR counter # 自增 1,键不存在时先置 0
INCRBY counter 10 # 自增指定步长
SETNX lock_key "locked" # 仅当键不存在时设置,分布式锁核心
SETEX session 3600 "data" # 设置值并指定秒级过期时间
APPEND mykey " World" # 在值末尾追加
STRLEN mykey # 获取值长度
SET 命令还支持 EX(秒级过期)、PX(毫秒级过期)、NX(仅键不存在时设置)、XX(仅键存在时设置)等选项,一条命令即可完成"设置值+过期时间+存在性判断"的组合操作。
2.2 List(列表)
List 是双向链表结构,适合消息队列、最新动态列表等场景。
bash
LPUSH mylist "a" "b" # 从头部插入
RPUSH mylist "c" # 从尾部插入
LPOP mylist # 弹出头部元素
RPOP mylist # 弹出尾部元素
LRANGE mylist 0 -1 # 获取全部元素(0 为头,-1 为尾)
LLEN mylist # 获取元素个数
LTRIM mylist 0 99 # 仅保留前 100 个元素
BLPOP mylist 30 # 阻塞式弹出,最多等待 30 秒
RPOPLPUSH src dst # 原子地将 src 尾部元素移到 dst 头部
BLPOP 和 BRPOP 的阻塞特性使其成为实现轻量级消息队列的理想选择,消费者可以阻塞等待,而不必轮询。
2.3 Hash(哈希)
Hash 适合存储对象的多个字段,比如用户信息、商品属性。
bash
HSET user:1 name "Alice" age 30 # 设置一个或多个字段
HGET user:1 name # 获取单个字段
HMSET user:1 name "Alice" age 30 # 批量设置(Redis 4.0+ 可直接用 HSET)
HMGET user:1 name age # 批量获取
HGETALL user:1 # 获取所有字段和值
HINCRBY user:1 age 1 # 字段值自增
HEXISTS user:1 email # 判断字段是否存在
HDEL user:1 age # 删除字段
HLEN user:1 # 获取字段数量
2.4 Set(集合)
Set 是无序不重复集合,适合标签、去重、共同好友等场景。
bash
SADD tags "redis" "nosql" # 添加元素
SREM tags "nosql" # 删除元素
SISMEMBER tags "redis" # 判断元素是否存在
SMEMBERS tags # 获取所有元素
SCARD tags # 获取元素个数
SINTER set1 set2 # 交集
SUNION set1 set2 # 并集
SDIFF set1 set2 # 差集(set1 中有而 set2 中没有)
SRANDMEMBER tags 2 # 随机获取 2 个元素(不删除)
SPOP tags 1 # 随机移除并返回 1 个元素
2.5 ZSet(有序集合)
ZSet 为每个元素关联一个 score,自动按 score 排序,是实现排行榜的核心数据结构。
bash
ZADD leaderboard 100 "Alice" 85 "Bob" # 添加元素及分数
ZRANGE leaderboard 0 -1 WITHSCORES # 按分数升序获取
ZREVRANGE leaderboard 0 9 WITHSCORES # 按分数降序获取前 10 名
ZRANGEBYSCORE leaderboard 80 100 # 按分数范围筛选
ZRANK leaderboard "Alice" # 获取升序排名(0 为最小)
ZREVRANK leaderboard "Alice" # 获取降序排名
ZINCRBY leaderboard 10 "Alice" # 增加分数
ZCARD leaderboard # 获取元素总数
ZCOUNT leaderboard 80 100 # 统计分数范围内的元素个数
三、通用键管理与数据库操作
跨数据类型的通用命令在日常运维中同样高频:
bash
EXISTS key # 判断键是否存在
TYPE key # 查看键的数据类型
DEL key # 删除键
EXPIRE key 3600 # 设置过期时间(秒)
TTL key # 查看剩余生存时间
PERSIST key # 移除过期时间
SCAN 0 MATCH user:* COUNT 100 # 游标迭代扫描,生产环境安全
INFO keyspace # 查看各数据库的键数量
DBSIZE # 当前数据库键总数
关于键遍历,有一个重要的生产禁忌 :KEYS * 会一次性扫描所有键,在键数量大时会阻塞 Redis 服务器。生产环境中应始终使用 SCAN 系列命令进行渐进式迭代。SCAN 采用游标机制,每次返回一批元素和一个新游标,当游标返回 0 时表示遍历完成。需要注意的是,SCAN 不保证元素不重复,应用层需自行处理去重。
四、高阶实战技巧
4.1 命令行直接执行与输出控制
redis-cli 支持将命令作为参数直接传入,执行后立即退出,非常适合脚本化:
bash
redis-cli INCR mycounter # 输出:(integer) 8
redis-cli GET mykey # 输出:"Hello"
当输出重定向到文件或管道时,redis-cli 会自动切换到原始输出模式,省略 (integer)、" 等类型标识。也可以用 --raw 强制原始输出,或用 --no-raw 强制人类可读输出。
4.2 批量数据导入:--pipe
--pipe 是向 Redis 批量加载数据最快的方式。它使用 Redis 协议直接将命令流式传输到服务器,速度远高于逐条执行。典型用法是将包含 Redis 协议格式命令的文件通过管道传入:
bash
cat commands.txt | redis-cli --pipe
4.3 大键扫描与内存分析
在排查性能问题时,大键(占用内存过多的键)往往是罪魁祸首。redis-cli 提供了内置的扫描模式:
bash
redis-cli --bigkeys # 扫描各数据类型中最大的键
redis-cli --memkeys # 按内存占用扫描键
redis-cli --bigkeys --memkeys # 组合使用
--bigkeys 基于 SCAN 实现,不会阻塞服务器,适合在生产环境中定期巡检。
4.4 发布订阅
redis-cli 可以直接进行发布订阅测试。打开一个终端订阅频道:
bash
redis-cli SUBSCRIBE news
在另一个终端发布消息:
bash
redis-cli PUBLISH news "Breaking: Redis 8.0 released"
订阅端会实时收到消息。需要注意的是,进入订阅状态的客户端无法执行除 SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE、PUNSUBSCRIBE 之外的命令,redis-cli 中需要按 Ctrl-C 退出订阅状态。
4.5 执行 Lua 脚本
通过 EVAL 或 --eval 可以在 redis-cli 中执行 Lua 脚本,实现原子性的复杂逻辑:
bash
# 内联执行
redis-cli EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 mykey "Hello"
# 从文件加载执行
redis-cli --eval script.lua key1 key2 , arg1 arg2
Lua 脚本在 Redis 中作为一个整体执行,期间不会被其他命令中断,天然具备原子性,适合实现"检查-设置"类的复合操作。
五、生产环境安全与性能诊断
5.1 安全禁忌
在使用 redis-cli 操作生产实例时,有几条不可逾越的红线:
- 不要在命令行中用
-a传递密码 ,改用REDISCLI_AUTH环境变量; - 不要在生产环境执行
KEYS *,用SCAN替代; FLUSHALL/FLUSHDB不可逆 ,执行前先用CLIENT LIST或INFO keyspace确认目标数据库;MONITOR会记录所有命令(包括敏感数据) ,绝不在生产服务器上长时间运行。
5.2 延迟诊断
redis-cli 内置了多种延迟检测模式:
bash
redis-cli --latency # 持续测量并显示延迟统计
redis-cli --latency-history # 按时间窗口分段显示延迟变化
redis-cli --latency-dist # 以 ASCII 频谱图展示延迟分布
redis-cli --intrinsic-latency 30 # 测量本机固有延迟(30 秒采样)
--intrinsic-latency 测量的是 Redis 进程所在机器的本机延迟下限,用于判断延迟问题是否由系统本身导致。
5.3 慢查询日志
Redis 的慢查询日志记录执行时间超过阈值的命令。通过 redis-cli 查询和清理:
bash
redis-cli SLOWLOG GET 10 # 查看最近 10 条慢查询
redis-cli SLOWLOG RESET # 清空慢查询日志
redis-cli SLOWLOG LEN # 查看慢查询条数
慢查询阈值的配置项为 slowlog-log-slower-than(单位微秒),默认值为 10000(即 10 毫秒)。
结语
redis-cli 远不止是一个"输入命令看结果"的简单工具。从基础的数据类型操作,到 --pipe 批量导入、--bigkeys 大键扫描、--latency 延迟诊断,再到 Lua 脚本执行和发布订阅测试,它覆盖了 Redis 日常开发与运维的绝大多数场景。掌握这些命令的用法和适用边界,尤其是在生产环境中遵守安全规范,才能让 redis-cli 真正成为高效而可靠的工具。