强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Redis 完全指南 / 06 - 命令详解

命令详解

本章系统整理 Redis 最常用的命令,按功能分类讲解,可作为日常开发的速查手册。

6.1 通用命令

Key 管理

# 检查 Key 是否存在
EXISTS user:1001             # 1(存在)
EXISTS user:1001 user:1002   # 2(存在的数量)

# 删除 Key
DEL user:1001                # 1(成功删除的数量)
DEL user:1001 user:1002      # 批量删除

# 异步删除(不阻塞主线程,推荐用于大 Key)
UNLINK user:1001

# 设置过期时间(秒)
EXPIRE session:abc 3600      # 3600 秒后过期
EXPIREAT user:1001 1735689600 # 在指定 Unix 时间戳过期

# 设置过期时间(毫秒)
PEXPIRE cache:hot 60000      # 60000 毫秒后过期
PEXPIREAT key 1735689600000

# 查看剩余生存时间
TTL session:abc              # 3599(秒)
PTTL session:abc             # 3599000(毫秒)
# -1 表示永不过期,-2 表示 Key 不存在

# 移除过期时间(变为永久)
PERSIST session:abc

# 重命名
RENAME old_key new_key       # 覆盖式重命名
RENAMENX old_key new_key     # 仅当 new_key 不存在时重命名

# 随机返回一个 Key
RANDOMKEY

# Key 的类型
TYPE user:1001               # hash
TYPE counter                  # string

# 查看 Key 的内部编码
OBJECT ENCODING user:1001    # "hashtable"
OBJECT REFCOUNT user:1001    # 引用计数
OBJECT IDLETIME user:1001    # 空闲时间(秒)
OBJECT FREQ user:1001        # 访问频率(LFU 模式)
OBJECT HELP                  # 查看帮助

# 序列化 Key
DUMP user:1001               # 返回序列化后的二进制数据
RESTORE user:1002 0 "\x00..." # 从序列化数据恢复

# 迁移 Key 到另一个 Redis 实例
MIGRATE target_host 6379 "" 0 5000 COPY REPLACE KEYS user:1001

遍历 Key

# ⚠️ KEYS 命令(会阻塞!生产环境禁止使用)
KEYS user:*                  # 匹配所有 user: 开头的 Key
KEYS *                       # 匹配所有 Key

# ✅ SCAN 命令(增量遍历,推荐)
SCAN 0 MATCH user:* COUNT 100
# 返回: 1) "176"     ← 下次遍历的 cursor
#       2) 1) "user:1001"
#          2) "user:1002"

# 继续遍历(直到 cursor 为 0)
SCAN 176 MATCH user:* COUNT 100

# 遍历 Hash 的字段
HSCAN user:1001 0 MATCH "na*" COUNT 10

# 遍历 Set 的元素
SSCAN tags:article:1001 0 COUNT 10

# 遍历 ZSet 的元素
ZSCAN leaderboard 0 COUNT 10

⚠️ 注意KEYS * 会遍历所有 Key,在数据量大时(> 10 万)会阻塞 Redis 数秒甚至数十秒。生产环境务必使用 SCAN

调试命令

# 查看 Key 大小(内存占用)
MEMORY USAGE user:1001       # 返回字节数
MEMORY USAGE user:1001 SAMPLES 5  # 采样 5 个子元素估算

# 调试对象信息
DEBUG OBJECT user:1001

# 查看 Key 最近访问时间
OBJECT IDLETIME user:1001    # 空闲秒数(LRU 模式下)

# 查看 Key 访问频率
OBJECT FREQ user:1001        # LFU 模式下

6.2 String 命令速查

命令 说明 时间复杂度
SET key value [EX/PX/EXAT/PXAT] [NX/XX] [GET] 设置值 O(1)
GET key 获取值 O(1)
MSET key value [key value ...] 批量设置 O(N)
MGET key [key ...] 批量获取 O(N)
SETNX key value 不存在才设置 O(1)
SETEX key seconds value 设置值+过期时间 O(1)
APPEND key value 追加字符串 O(1)
STRLEN key 字符串长度 O(1)
INCR key 自增 1 O(1)
INCRBY key increment 自增 N O(1)
INCRBYFLOAT key increment 浮点数自增 O(1)
DECR key 自减 1 O(1)
DECRBY key decrement 自减 N O(1)
GETRANGE key start end 获取子串 O(N)
SETRANGE key offset value 覆盖子串 O(N)
GETSET key value 设置新值,返回旧值 O(1)
GETDEL key 获取并删除 O(1)
GETEX key [EX/PX/EXAT/PXAT] [PERSIST] 获取并设置/移除过期 O(1)

SET 命令详解(最重要)

# 基础用法
SET key "value"

# 带过期时间
SET key "value" EX 60          # 60 秒
SET key "value" PX 60000       # 60000 毫秒
SET key "value" EXAT 1735689600 # Unix 时间戳

# 条件设置
SET key "value" NX             # 仅当 key 不存在时设置
SET key "value" XX             # 仅当 key 已存在时设置

# 设置并返回旧值
SET key "new_value" GET        # 返回旧值 "old_value"

# 组合用法
SET lock:order "uuid" NX EX 30 # 不存在才设置 + 30 秒过期(分布式锁)

6.3 List 命令速查

命令 说明 时间复杂度
LPUSH key value [value ...] 左端推入 O(N)
RPUSH key value [value ...] 右端推入 O(N)
LPOP key [count] 左端弹出 O(N)
RPOP key [count] 右端弹出 O(N)
BLPOP key [key ...] timeout 阻塞左弹出 O(N)
BRPOP key [key ...] timeout 阻塞右弹出 O(N)
LINDEX key index 按索引获取 O(N)
LLEN key 列表长度 O(1)
LRANGE key start stop 范围查询 O(S+N)
LTRIM key start stop 修剪列表 O(N)
LINSERT key BEFORE/AFTER pivot value 插入元素 O(N)
LREM key count value 移除元素 O(N+M)
LSET key index value 设置索引处的值 O(N)
LPOS key element [RANK rank] [COUNT count] 查找元素位置 O(N)
LMPOP numkeys key [key ...] LEFT/RIGHT [COUNT count] 多列表弹出 O(N+M)
RPOPLPUSH source destination 弹出并推入 O(1)
LMOVE source destination LEFT/RIGHT LEFT/RIGHT 移动元素 O(1)

6.4 Hash 命令速查

命令 说明 时间复杂度
HSET key field value [field value ...] 设置字段 O(N)
HGET key field 获取字段 O(1)
HMSET key field value [field value ...] 批量设置 O(N)
HMGET key field [field ...] 批量获取 O(N)
HGETALL key 获取全部 O(N)
HSETNX key field value 字段不存在才设置 O(1)
HINCRBY key field increment 字段自增 O(1)
HINCRBYFLOAT key field increment 浮点自增 O(1)
HDEL key field [field ...] 删除字段 O(N)
HEXISTS key field 字段是否存在 O(1)
HKEYS key 所有字段名 O(N)
HVALS key 所有值 O(N)
HLEN key 字段数量 O(1)
HSTRLEN key field 字段值长度 O(1)
HRANDFIELD key [count [WITHVALUES]] 随机字段 O(N)
HSCAN key cursor [MATCH pattern] [COUNT count] 增量遍历 O(1)

6.5 Set 命令速查

命令 说明 时间复杂度
SADD key member [member ...] 添加元素 O(N)
SREM key member [member ...] 删除元素 O(N)
SISMEMBER key member 判断成员 O(1)
SMISMEMBER key [member ...] 批量判断 O(N)
SCARD key 集合大小 O(1)
SMEMBERS key 所有元素 O(N)
SRANDMEMBER key [count] 随机元素(不删除) O(N)
SPOP key [count] 随机弹出 O(N)
SINTER key [key ...] 交集 O(N*M)
SUNION key [key ...] 并集 O(N)
SDIFF key [key ...] 差集 O(N)
SINTERSTORE dest key [key ...] 交集存储 O(N*M)
SUNIONSTORE dest key [key ...] 并集存储 O(N)
SDIFFSTORE dest key [key ...] 差集存储 O(N)
SMOVE source dest member 移动元素 O(1)
SSCAN key cursor [MATCH pattern] [COUNT count] 增量遍历 O(1)

6.6 ZSet 命令速查

命令 说明 时间复杂度
ZADD key [NX/XX] [GT/LT] [CH] [INCR] score member 添加/更新 O(log N)
ZREM key member [member ...] 删除元素 O(M*log N)
ZSCORE key member 获取分数 O(1)
ZINCRBY key increment member 分数自增 O(log N)
ZCARD key 元素数量 O(1)
ZCOUNT key min max 分数区间计数 O(log N)
ZRANK key member 排名(升序) O(log N)
ZREVRANK key member 排名(降序) O(log N)
ZRANGE key start stop [WITHSCORES] 排名范围查询 O(log N+M)
ZREVRANGE key start stop [WITHSCORES] 逆序排名查询 O(log N+M)
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 分数范围查询 O(log N+M)
ZREVRANGEBYSCORE key max min [WITHSCORES] 逆序分数范围 O(log N+M)
ZRANGEBYLEX key min max [LIMIT offset count] 字典序范围 O(log N+M)
ZRANGESTORE dst key start stop [BYSCORE/BYRANK] 范围存储 O(log N+M)
ZPOPMIN key [count] 弹出最低分 O(M*log N)
ZPOPMAX key [count] 弹出最高分 O(M*log N)
BZPOPMIN key [key ...] timeout 阻塞弹出最低分 O(N)
BZPOPMAX key [key ...] timeout 阻塞弹出最高分 O(N)
ZLEXCOUNT key min max 字典序区间计数 O(log N)
ZSCAN key cursor [MATCH pattern] [COUNT count] 增量遍历 O(1)
ZDIFF numkeys key [key ...] [WITHSCORES] 差集 O(N)
ZUNION numkeys key [key ...] [WEIGHTS ...] [AGGREGATE SUM/MIN/MAX] 并集 O(N)
ZINTER numkeys key [key ...] [WEIGHTS ...] [AGGREGATE SUM/MIN/MAX] 交集 O(N)

6.7 服务器管理命令

连接管理

# 认证
AUTH password
AUTH username password       # ACL 方式(Redis 6.0+)

# 切换数据库
SELECT 0                     # 默认数据库 0
SELECT 15                    # 切换到数据库 15

# Ping 测试
PING                         # PONG
PING "hello"                 # "hello"

# 退出连接
QUIT

# 服务器时间
TIME                         # 1) "1715318400"  2) "123456"

配置管理

# 获取配置
CONFIG GET maxmemory
CONFIG GET *                 # 获取所有配置
CONFIG GET "max*"            # 模式匹配

# 设置配置(运行时生效)
CONFIG SET maxmemory 4gb
CONFIG SET maxmemory-policy allkeys-lfu

# 重置统计信息
CONFIG RESETSTAT

# 持久化配置到磁盘
CONFIG REWRITE

信息查询

# 服务器信息(各模块)
INFO                         # 全部信息
INFO server                  # 服务器信息
INFO clients                 # 客户端信息
INFO memory                  # 内存信息
INFO stats                   # 统计信息
INFO replication             # 复制信息
INFO keyspace                # 数据库键空间信息

# 关键指标速查
INFO memory | grep used_memory_human
INFO stats | grep instantaneous_ops_per_sec
INFO clients | grep connected_clients

客户端管理

# 查看客户端连接列表
CLIENT LIST

# 获取当前连接 ID
CLIENT ID

# 获取连接名称
CLIENT GETNAME

# 设置连接名称
CLIENT SETNAME my-app-1

# 关闭指定连接
CLIENT KILL ID 123
CLIENT KILL ADDR 192.168.1.100:54321

# 暂停/恢复客户端
CLIENT PAUSE 5000            # 暂停所有客户端 5 秒
CLIENT UNPAUSE

# 获取客户端信息
CLIENT INFO

数据库管理

# 查看数据库键数量
DBSIZE

# 查看所有数据库的键数量
INFO keyspace

# 清空当前数据库(⚠️ 危险!)
FLUSHDB
FLUSHDB ASYNC                # 异步清空(推荐)

# 清空所有数据库(⚠️ 极度危险!)
FLUSHALL
FLUSHALL ASYNC

# 保存(同步 RDB)
SAVE                         # ⚠️ 会阻塞主线程!

# 后台保存(推荐)
BGSAVE

# 重写 AOF
BGREWRITEAOF

# 最后一次成功保存的时间
LASTSAVE

# 关闭服务器
SHUTDOWN                     # 保存数据后关闭
SHUTDOWN NOSAVE              # 不保存直接关闭
SHUTDOWN SAVE                # 强制保存后关闭

慢查询日志

# 获取慢查询日志
SLOWLOG GET 10               # 最近 10 条

# 获取慢查询日志长度
SLOWLOG LEN

# 重置慢查询日志
SLOWLOG RESET

# 设置慢查询阈值(运行时)
CONFIG SET slowlog-log-slower-than 10000   # 10ms

# 查看慢查询日志条目的详细信息
SLOWLOG GET 1
# 1) 1) (integer) 1           # 日志 ID
#    2) (integer) 1715318400  # 发生时间
#    3) (integer) 15000       # 耗时(微秒)
#    4) 1) "KEYS"             # 命令
#       2) "*"
#    5) "127.0.0.1:54321"     # 客户端地址
#    6) ""                    # 客户端名称

6.8 命令时间复杂度参考

理解命令的时间复杂度对性能调优至关重要:

复杂度 典型命令 说明
O(1) GET, SET, HGET, SISMEMBER, ZSCORE 常数时间,最佳
O(log N) ZADD, ZREM, ZSCORE 对数时间,很好
O(N) LRANGE, SMEMBERS, HGETALL, KEYS 线性时间,注意数据量
O(N+M) SINTER, ZUNION 多集合运算
O(N*log N) SORT 排序操作

💡 技巧:对于 O(N) 命令,用 COUNT 参数限制返回数量:LRANGE key 0 99HSCANSSCAN


📌 业务场景

场景一:运维排查快速命令集

# 快速了解 Redis 状态
redis-cli INFO all | grep -E "used_memory_human|connected_clients|instantaneous_ops_per_sec|keyspace_hits|keyspace_misses"

# 找出大 Key(生产安全方式)
redis-cli --bigkeys --i 0.1

# 检查内存碎片率
redis-cli INFO memory | grep mem_fragmentation_ratio

# 查看最近慢查询
redis-cli SLOWLOG GET 10

场景二:批量数据迁移

# 源 Redis 导出
redis-cli --rdb dump.rdb

# 目标 Redis 导入
redis-cli -h target_host -a password --pipe < commands.txt

场景三:运行时调优

# 发现内存快满时临时调整
redis-cli CONFIG SET maxmemory 8gb
redis-cli CONFIG SET maxmemory-policy allkeys-lru

# 持久化配置
redis-cli CONFIG REWRITE

🔗 扩展阅读