Redis常用命令详解:基础、进阶与场景化实战案例
时间:2026-06-14 07:04
从基础通用命令到核心数据类型操作(String、Hash、List、Set、ZSet),再到事务、分布式锁、发布订阅、持久化及批量操作,全面梳理Redis命令体系。涵盖键管理、性能优化、并发控制及场景化工具,帮助高效应对各类业务需求。
Redis 常用命令全解析:基础、进阶与场景化实战
在 Redis 的日常使用中,命令就是最直接的操作工具。不管是刚入门还是长期维护,掌握一套成体系的命令,能让你在面对各种业务场景时游刃有余。下面就从最基础的通用命令开始,逐步深入到数据类型、事务、分布式锁,再到 Geo、Bitmaps 和 HyperLogLog 这些场景化工具,争取把 Redis 的命令体系一次性理清楚。
一、基础通用命令
这些命令不挑数据类型,适用于所有场景。它们的主要作用是管理键、查看运行状态,是每次操作 Redis 最前置的必备技能。

| 命令 | 作用 | 示例 |
|---|
KEYS pattern | 查找符合匹配模式的所有键(生产环境可得小心用,会阻塞 Redis) | KEYS user* → 查找所有以user开头的键 |
EXISTS key | 判断键是否存在,返回 1(存在)/0(不存在) | EXISTS user:100 → 检查键user:100是否存在 |
DEL key [key ...] | 删除指定键(可批量),返回删除成功的键数量 | DEL user:100 cart:100 → 删除user:100和cart:100 |
EXPIRE key seconds | 为键设置过期时间(单位:秒) | EXPIRE code:1234 60 → 键code:123460 秒后过期 |
TTL key | 查看键的剩余过期时间(-1 = 永不过期,-2 = 已过期 / 不存在) | TTL code:1234 → 返回剩余秒数 |
PERSIST key | 移除键的过期时间,使其永久有效 | PERSIST code:1234 → 取消code:1234的过期时间 |
TYPE key | 查看键对应值的数据类型 | TYPE user:100 → 返回hash/string/list等 |
FLUSHDB | 清空当前数据库的所有键(慎用,别手抖) | FLUSHDB → 清空当前库 |
FLUSHALL | 清空所有数据库的所有键(生产环境严禁使用,除非你准备跑路) | FLUSHALL → 清空全部库 |
二、核心数据类型命令
Redis 之所以强大,关键在于它支持多种数据结构。下面把 String、Hash、List、Set、ZSet 这五种核心类型掰开揉碎,看看每个类型的常用命令。
1. 字符串(String)- 最基础的键值对类型
适用于存储简单值,比如数字、文本,这也是 Redis 最常用的类型。
```
# 设置键值(覆盖原有值)
SET name "张三"
# 设置键值并指定过期时间(30秒)
SETEX code 30 "8866"
# 获取值
GET name
# 数值自增(+1,仅适用于数字值)
INCR num
# 数值自增指定步长(+5)
INCRBY num 5
# 数值自减(-1)
DECR num
# 追加字符串到原有值末尾
APPEND name " - 程序员"
```
2. 哈希(Hash)- 适用于存储对象(如用户信息、商品信息)
一个 Hash 键可以存储多个字段和值,可以把它想象成 Ja va 里的 Map。
```
# 设置Hash的单个字段
HSET user:100 name "李四" age 25
# 设置Hash的多个字段
HMSET user:100 name "李四" age 25 gender "男"
# 获取Hash的单个字段值
HGET user:100 name
# 获取Hash的多个字段值
HMGET user:100 name age
# 获取Hash的所有字段和值
HGETALL user:100
# 获取Hash的所有字段名
HKEYS user:100
# 获取Hash的所有值
HVALS user:100
# 判断Hash的字段是否存在
HEXISTS user:100 age
# 删除Hash的指定字段
HDEL user:100 gender
# 获取Hash的字段数量
HLEN user:100
```
3. 列表(List)- 有序、可重复的集合,适用于队列 / 栈场景
底层是双向链表,支持从头部或尾部操作元素,典型的队列用法。
```
# 从列表尾部添加元素
RPUSH list:msg "消息1" "消息2"
# 从列表头部添加元素
LPUSH list:msg "消息0"
# 从列表尾部移除并返回元素
RPOP list:msg
# 从列表头部移除并返回元素
LPOP list:msg
# 获取列表指定范围的元素(0=-1表示所有)
LRANGE list:msg 0 -1
# 获取列表长度
LLEN list:msg
# 根据索引获取元素
LINDEX list:msg 1
# 根据索引修改元素
LSET list:msg 1 "修改后的消息2"
```
4. 集合(Set)- 无序、不可重复的集合,适用于去重 / 交集场景
它支持集合间的交、并、差运算,这在很多业务场景里非常实用。
```
# 向集合添加元素
SADD set:tags "Ja va" "Redis" "MySQL"
# 获取集合所有元素
SMEMBERS set:tags
# 判断元素是否在集合中
SISMEMBER set:tags "Redis"
# 删除集合指定元素
SREM set:tags "MySQL"
# 获取集合元素数量
SCARD set:tags
# 求两个集合的交集(共同元素)
SINTER set:tags1 set:tags2
# 求两个集合的并集(所有元素,去重)
SUNION set:tags1 set:tags2
# 求两个集合的差集(在set1中但不在set2中的元素)
SDIFF set:tags1 set:tags2
```
5. 有序集合(ZSet)- 有序、不可重复的集合,适用于排名 / 计分场景
每个元素关联一个分数(score),Redis 会根据分数自动排序。
```
# 向有序集合添加元素(score为分数)
ZADD zset:rank 95 "张三" 90 "李四" 98 "王五"
# 获取有序集合所有元素(带分数,默认升序)
ZRANGE zset:rank 0 -1 WITHSCORES
# 获取有序集合所有元素(降序)
ZREVRANGE zset:rank 0 -1 WITHSCORES
# 获取指定元素的分数
ZSCORE zset:rank "张三"
# 增加指定元素的分数(+3)
ZINCRBY zset:rank 3 "张三"
# 获取元素的排名(升序,从0开始)
ZRANK zset:rank "李四"
# 获取元素的排名(降序)
ZREVRANK zset:rank "李四"
# 删除指定元素
ZREM zset:rank "李四"
# 获取集合元素数量
ZCARD zset:rank
```
三、开发常用命令
1、进阶通用命令(开发排查 / 性能优化常用)
这类命令是基础通用命令的补充,尤其适合在生产环境里遍历键、监控性能、管理连接。
| 命令 | 作用 | 示例 / 说明 |
|---|
SCAN cursor [MATCH pattern] [COUNT count] | 非阻塞式遍历键(替代KEYS,生产环境首选),分批返回键,避免阻塞 Redis | SCAN 0 MATCH user:* COUNT 100 → 从游标 0 开始,匹配user:*,每次返回 100 个键 |
INFO [section] | 查看 Redis 运行状态信息(如内存、连接、持久化),排查性能问题 | INFO memory → 查看内存使用;INFO stats → 查看统计指标 |
CLIENT LIST | 列出所有连接到 Redis 的客户端信息(IP、状态、耗时) | 排查长连接 / 慢连接问题,定位异常客户端 |
CLIENT KILL ip:port | 关闭指定 IP + 端口的客户端连接 | CLIENT KILL 192.168.1.100:54321 → 断开该客户端连接 |
DBSIZE | 统计当前数据库的键总数 | 快速了解当前库数据量,比KEYS *高效 |
RENAMENX oldkey newkey | 重命名键(仅当 newkey 不存在时才成功,避免覆盖) | RENAMENX user:old user:new → 安全重命名 |
MOVE key db | 将键移动到指定数据库(Redis 默认 16 个库,编号 0-15) | MOVE user:100 1 → 把user:100移到 1 号库 |
2、事务与分布式锁相关命令(高并发场景核心)
Redis 事务可以保证命令的原子性执行,而
SETNX、
GETSET和
Redlock 是实现分布式锁的核心工具。
**(1) 事务命令**
Redis 事务通过 `MULTI`(开启)、`EXEC`(执行)、`DISCARD`(取消)实现,命令入队后批量执行:
```
# 开启事务
MULTI
# 入队命令(此时不执行,仅记录)
SET order:100 status "paid"
HSET user:100 order_count 1
# 执行事务(所有入队命令原子执行)
EXEC
# 取消事务(放弃所有入队命令)
MULTI
SET a 1
DISCARD # 事务取消,SET a 1不会执行
```
**(2) 分布式锁核心命令**
```
# 1. SETNX:设置键(仅当键不存在时成功,返回1=加锁成功,0=已被占用)
# 缺点:若加锁客户端宕机,锁无法释放,需配合过期时间
SETNX lock:order 1
EXPIRE lock:order 30 # 给锁设置30秒过期,避免死锁
# 2. SET(推荐):原子性设置值+过期时间(解决SETNX+EXPIRE非原子问题)
SET lock:order 1 NX EX 30 # NX=仅当键不存在时设置;EX=过期时间(秒);PX=过期时间(毫秒)
# 3. GETSET:获取旧值并设置新值(解锁/锁续期用)
# 解锁逻辑示例:先判断值是否是自己的锁,再删除(伪代码)
if GET lock:order == "my_lock_value"
DEL lock:order
# 4. DEL:释放锁(需配合业务逻辑,避免误删其他客户端的锁)
DEL lock:order
```
3、发布订阅命令(异步通知 / 消息广播场景)
适用于实时通知场景,比如订单状态变更、消息推送,这时 Redis 可以充当轻量级消息中间件。
```
# 订阅频道(客户端1)
SUBSCRIBE channel:order_notify # 订阅order_notify频道
PSUBSCRIBE channel:* # 订阅所有以channel:开头的频道(通配符)
# 发布消息(客户端2)
PUBLISH channel:order_notify "订单100已支付" # 向频道发布消息,订阅端实时接收
# 取消订阅
UNSUBSCRIBE channel:order_notify # 取消指定频道订阅
PUNSUBSCRIBE channel:* # 取消通配符订阅
```
4、持久化相关命令(数据备份 / 恢复常用)
Redis 持久化分 RDB(快照)和 AOF(日志),下面这些命令用于手动触发持久化、查看配置:
```
# 手动触发RDB快照(阻塞Redis,生产环境建议低峰期执行)
BGSA VE # 后台异步保存(推荐)
SA VE # 同步保存(阻塞,慎用)
# 查看持久化配置
CONFIG GET sa ve # 查看RDB自动保存触发条件(如"900 1"=900秒内至少1个键修改则保存)
CONFIG GET appendonly # 查看AOF是否开启(yes/no)
# 手动触发AOF重写(压缩AOF日志,减少文件体积)
BGREWRITEAOF # 后台异步重写(推荐)
```
5、过期时间进阶命令(精准控制键有效期)
补充一些基础过期命令的细节,适配不同时间精度需求:
```
# PEXPIRE:设置过期时间(单位:毫秒,适配高精度场景)
PEXPIRE code:1234 60000 # 60秒(60000毫秒)后过期
# EXPIREAT:指定过期时间戳(秒)
EXPIREAT user:100 1735689600 # 键在2025-01-01 00:00:00过期
# PEXPIREAT:指定过期时间戳(毫秒)
PEXPIREAT user:100 1735689600000
# TTL/PTTL:查看剩余过期时间(PTTL返回毫秒)
PTTL code:1234 # 返回剩余毫秒数
```
四、其他常用命令
1、批量操作命令(提升读写效率)
批量操作能大幅减少网络 IO 次数,对于单线程的 Redis 来说,网络往返就是性能瓶颈,所以这在高并发场景下是必备技能。
**(1)String 类型批量操作**
```
# 批量设置多个键值对(原子操作)
MSET name "张三" age 25 email "zhangsan@test.com"
# 批量获取多个键的值(返回顺序与参数一致)
MGET name age email # 返回 ["张三", "25", "zhangsan@test.com"]
# 批量设置键值+过期时间(Redis 7.0+支持,替代SETEX批量场景)
MSETEX key1 60 "val1" key2 120 "val2"
```
**(2)Hash 类型批量操作**
```
# 批量设置Hash字段
HMSET user:101 name "王五" phone "13800138000" address "北京"
# 批量获取Hash字段(指定多个field,减少网络请求)
HMGET user:101 name phone # 返回 ["王五", "13800138000"]
```
**(3)通用批量删除**
```
# 结合SCAN+DEL实现批量删除(生产环境替代KEYS+DEL)
# 示例:删除所有以temp:开头的键(伪代码)
cursor=0
while true; do
# 分批获取键
result=$(redis-cli SCAN $cursor MATCH temp:* COUNT 100)
# 解析游标和键列表
cursor=$(echo $result | awk 'NR==1{print $1}')
keys=$(echo $result | awk 'NR==2{print $0}')
# 批量删除
if [ -n "$keys" ]; then
redis-cli DEL $keys
fi
# 游标为0时结束
if [ $cursor -eq 0 ]; then
break
fi
done
```
2、管道(Pipeline)与脚本(Lua)命令(高性能批量执行)
**(1)管道(Pipeline)命令**
管道允许客户端一次性发送多个命令,Redis 批量执行后返回结果,能有效减少网络往返次数:
```
# 终端执行管道命令示例(echo + redis-cli --pipe)
echo -e "SET a 1nINCR anGET a" | redis-cli --pipe
# 输出:所有命令执行结果,最终GET a返回2
```
**(2)Lua 脚本命令(原子性执行复杂逻辑)**
Lua 脚本在 Redis 中原子执行,非常适合处理多命令竞态问题,比如分布式锁续期、库存扣减:
```
# EVAL:执行Lua脚本(核心命令)
# 格式:EVAL 脚本 键参数个数 键1 键2 ... 参数1 参数2 ...
# 示例:原子性实现“先判断值再修改”(库存扣减,库存>=1才扣减)
EVAL "local stock = tonumber(redis.call('GET', KEYS[1]))
if stock and stock >= 1 then
redis.call('DECR', KEYS[1])
return 1 # 扣减成功
else
return 0 # 库存不足
end" 1 stock:1001
# SCRIPT LOAD:预加载Lua脚本(避免重复传输脚本内容)
SCRIPT LOAD "return redis.call('GET', KEYS[1])" # 返回脚本SHA1值
# EVALSHA:执行预加载的脚本(更高效)
EVALSHA 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 1 stock:1001
# SCRIPT EXISTS:检查脚本是否已加载
SCRIPT EXISTS 5332031c6b470dc5a0dd9b4bf2030dea6d65de91
# SCRIPT FLUSH:清空所有预加载的Lua脚本
SCRIPT FLUSH
```
3、Geo 地理定位命令(LBS 场景必备)
适用于地图相关业务,比如附近的人、门店、外卖配送,Redis 支持经纬度存储和距离计算:
```
# GEOADD:添加地理位置(经度,纬度,位置名称)
GEOADD shop:nearby 116.403874 39.914885 "门店A" 116.410049 39.914575 "门店B"
# GEOPOS:获取指定位置的经纬度
GEOPOS shop:nearby "门店A" # 返回 [116.403874, 39.914885]
# GEODIST:计算两个位置的距离(单位:m/km/mi/ft)
GEODIST shop:nearby "门店A" "门店B" km # 返回距离(如0.58km)
# GEORADIUS:根据经纬度范围查找位置(附近的门店)
# 示例:查找经度116.405、纬度39.915,半径1km内的所有门店
GEORADIUS shop:nearby 116.405 39.915 1 km WITHDIST WITHCOORD
# GEORADIUSBYMEMBER:根据已有位置查找附近位置
# 示例:查找门店A周围1km内的所有门店
GEORADIUSBYMEMBER shop:nearby "门店A" 1 km WITHDIST
```
4、Bitmaps 位图命令(高效存储布尔值)
适用于海量布尔值场景,比如用户签到、是否在线、权限开关。1 个键可以存储 2^32 个布尔值,内存占用极低:
```
# SETBIT:设置指定偏移量的位值(0/1)
# 示例:用户1001在第5天签到(偏移量5,值1)
SETBIT sign:1001 5 1
# GETBIT:获取指定偏移量的位值
GETBIT sign:1001 5 # 返回1(已签到),0(未签到)
# BITCOUNT:统计指定范围内值为1的位数量
# 示例:统计用户1001当月(30天)的签到次数
BITCOUNT sign:1001 0 29 # 返回签到天数
# BITOP:位图运算(AND/OR/XOR/NOT)
# 示例:统计同时签到的用户(用户1001和1002的签到交集)
BITOP AND sign:common sign:1001 sign:1002
BITCOUNT sign:common # 返回共同签到天数
```
5、HyperLogLog 基数统计命令(海量数据去重统计)
适用于统计不重复元素个数的场景,比如 UV 统计、独立访客数。它占用内存固定(大约 12KB),却能处理海量数据:
```
# PFADD:添加元素到HyperLogLog集合
PFADD uv:20260121 "user1001" "user1002" "user1003"
# PFCOUNT:统计集合的基数(不重复元素个数)
PFCOUNT uv:20260121 # 返回3
# PFMERGE:合并多个HyperLogLog集合
# 示例:合并1月21日和1月22日的UV数据
PFMERGE uv:202601 uv:20260121 uv:20260122
PFCOUNT uv:202601 # 返回两天的总独立访客数
```
6、连接与认证命令(运维 / 开发调试)
```
# AUTH:认证密码(Redis设置密码后,连接时需认证)
AUTH yourpassword # 认证成功返回OK,失败返回错误
# SELECT:切换数据库(Redis默认16个库,0-15)
SELECT 1 # 切换到1号库
# PING:测试Redis连接是否正常
PING # 返回PONG表示连接正常
# QUIT:关闭客户端连接
QUIT
# CONFIG SET/GET:动态修改/查看配置(无需重启Redis)
# 示例:修改最大内存为10GB
CONFIG SET maxmemory 10gb
# 示例:查看AOF开关状态
CONFIG GET appendonly
```
总结
**1. 通用命令**:重点掌握 `EXISTS`(判断键存在)、`DEL`(删除键)、`EXPIRE`(设置过期)、`TYPE`(查看类型),这是所有操作的基础。
**2. 核心类型命令**:
- String:`SET/GET`(基础读写)、`INCR/INCRBY`(数值自增);
- Hash:`HSET/HGET/HGETALL`(对象读写);
- List:`LPUSH/RPUSH/LPOP/RPOP`(队列操作);
- Set:`SADD/SMEMBERS/SINTER`(去重 / 集合运算);
- ZSet:`ZADD/ZRANGE/ZREVRANGE`(排名场景)。
**3. 生产环境**中尽量避免使用 `KEYS` 命令(会阻塞 Redis),如果需要遍历键,优先使用 `SCAN` 命令(分批遍历,非阻塞)。
**4. 进阶通用命令**:优先用 `SCAN` 替代 `KEYS`,用 `INFO` 排查性能问题,用 `CLIENT LIST` 定位连接异常。
**5. 分布式锁**:核心就是用 `SET key value NX EX seconds`(原子加锁 + 过期),避免 `SETNX+EXPIRE` 非原子问题。
**6. 业务场景命令**:发布订阅(`PUBLISH/SUBSCRIBE`)适用于异步通知,事务(`MULTI/EXEC`)保证命令原子执行,`BGSA VE/BGREWRITEAOF` 用于持久化备份。
**7. 过期时间**:毫秒级需求用 `PEXPIRE/PEXPIREAT`,时间戳过期用 `EXPIREAT`,精准控制键的有效期。
**8. 批量 / 高性能命令**:`MSET/MGET`(批量读写)、Pipeline(减少网络 IO)、Lua 脚本(原子执行复杂逻辑)是提升 Redis 性能的核心,高并发场景必用。
**9. 场景化命令**:
- Geo 命令(LBS 场景:附近的人 / 门店);
- Bitmaps(海量布尔值:签到 / 在线状态);
- HyperLogLog(海量去重统计:UV / 独立访客)。
**10. 运维调试命令**:`AUTH`/`SELECT`/`PING`(连接认证)、`CONFIG SET/GET`(动态配置)、`SCAN+DEL`(安全批量删除)是开发 / 运维排查问题的常用命令。
**11. 选择原则**:根据业务场景匹配命令——性能优先选批量 / 管道,地理场景选 Geo,布尔统计选 Bitmaps,去重统计选 HyperLogLog。