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 99、HSCAN、SSCAN。
📌 业务场景
场景一:运维排查快速命令集
# 快速了解 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
🔗 扩展阅读