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

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自增 1O(1)
INCRBY key increment自增 NO(1)
INCRBYFLOAT key increment浮点数自增O(1)
DECR key自减 1O(1)
DECRBY key decrement自减 NO(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

🔗 扩展阅读