Redis命令大全

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 真正成为高效而可靠的工具。

相关推荐
java1234_小锋4 小时前
Redis 宣布正式接入 AI
数据库·人工智能·redis
行百里er4 小时前
Redis 持久化——RDB 快照 vs AOF 日志
redis·后端
程序猿乐锅5 小时前
一文讲透缓存穿透、击穿和雪崩
java·redis·spring·缓存·mybatis
程序猿乐锅6 小时前
【黑马点评 | 第七篇】Redis 分布式锁的两种实现
java·数据库·redis·分布式·spring·缓存
程序猿乐锅8 小时前
【黑马点评 | 第九篇】秒杀优化-异步实现
java·spring boot·redis·后端·spring·中间件·mybatis
旋生万物12 小时前
Redis 缓存雪崩?不是 TTL 一样,是过期相位同步塌陷(附打散脚本)
redis·缓存·aigc·螺旋生成论·螺旋相位
夕除13 小时前
redis--020
redis
不好听61320 小时前
缓存三大坑:穿透·击穿·雪崩一次讲透
redis
行百里er20 小时前
Redis 核心数据结构(四)——Set 与 Sorted Set,去重与排名神器
redis·后端