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:100cart: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)这 5 种核心类型的常用命令。

1. 字符串(String)- 最基础的键值对类型

适用于存储简单值(如数字、文本),是 Redis 最常用的类型。

bash 复制代码
# 设置键值(覆盖原有值)
SET name "张三"
# 设置键值并指定过期时间(30秒)
SETEX code 30 "8866"
# 获取值
GET name
# 数值自增(+1,仅适用于数字值)
INCR num
# 数值自增指定步长(+5)
INCRBY num 5
# 数值自减(-1)
DECR num
# 追加字符串到原有值末尾
APPEND name " - 程序员"
2. 哈希(Hash)- 适用于存储对象(如用户信息、商品信息)

一个 Hash 键可以存储多个字段(field)和值(value),类似 Java 的 Map。

bash 复制代码
# 设置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)- 有序、可重复的集合,适用于队列 / 栈场景

底层是双向链表,支持从头部 / 尾部操作元素。

bash 复制代码
# 从列表尾部添加元素
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)- 无序、不可重复的集合,适用于去重 / 交集场景

支持集合间的交、并、差运算。

bash 复制代码
# 向集合添加元素
SADD set:tags "Java" "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 根据分数排序。

bash 复制代码
# 向有序集合添加元素(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(取消)实现,命令入队后批量执行:

bash 复制代码
# 开启事务
MULTI
# 入队命令(此时不执行,仅记录)
SET order:100 status "paid"
HSET user:100 order_count 1
# 执行事务(所有入队命令原子执行)
EXEC

# 取消事务(放弃所有入队命令)
MULTI
SET a 1
DISCARD  # 事务取消,SET a 1不会执行
(2) 分布式锁核心命令(解决多服务并发竞争)
bash 复制代码
# 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 作为轻量级消息中间件使用。

bash 复制代码
# 订阅频道(客户端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(日志),以下命令用于手动触发持久化、查看配置:

bash 复制代码
# 手动触发RDB快照(阻塞Redis,生产环境建议低峰期执行)
BGSAVE  # 后台异步保存(推荐);SAVE  # 同步保存(阻塞,慎用)

# 查看持久化配置
CONFIG GET save        # 查看RDB自动保存触发条件(如"900 1"=900秒内至少1个键修改则保存)
CONFIG GET appendonly  # 查看AOF是否开启(yes/no)

# 手动触发AOF重写(压缩AOF日志,减少文件体积)
BGREWRITEAOF  # 后台异步重写(推荐)
5、过期时间进阶命令(精准控制键有效期)

补充基础过期命令的细节,适配不同时间精度需求:

bash 复制代码
# 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 类型批量操作
bash 复制代码
# 批量设置多个键值对(原子操作)
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 类型批量操作(补充)
bash 复制代码
# 批量设置Hash字段(已提过,补充批量获取优化)
HMSET user:101 name "王五" phone "13800138000" address "北京"

# 批量获取Hash字段(指定多个field,减少网络请求)
HMGET user:101 name phone  # 返回 ["王五", "13800138000"]
(3) 通用批量删除(补充)
bash 复制代码
# 结合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 批量执行后返回结果,减少网络往返次数:

bash 复制代码
# 终端执行管道命令示例(echo + redis-cli --pipe)
echo -e "SET a 1\nINCR a\nGET a" | redis-cli --pipe
# 输出:所有命令执行结果,最终GET a返回2
(2) Lua 脚本命令(原子性执行复杂逻辑)

Lua 脚本在 Redis 中原子执行,避免多命令竞态问题(如分布式锁续期、库存扣减):

bash 复制代码
# 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 支持经纬度存储和距离计算:

bash 复制代码
# 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 个布尔值,内存占用极低:

bash 复制代码
# 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),支持海量数据:

bash 复制代码
# 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、连接与认证命令(运维 / 开发调试)
bash 复制代码
# 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替代KEYSINFO排查性能问题,CLIENT LIST定位连接异常;

5.分布式锁 :核心用SET key value NX EX seconds(原子加锁 + 过期),避免SETNX+EXPIRE非原子问题;

6.业务场景命令 :发布订阅(PUBLISH/SUBSCRIBE)适用于异步通知,事务(MULTI/EXEC)保证命令原子执行,BGSAVE/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。

相关推荐
让我上个超影吧2 小时前
天机学堂——多级缓存
java·spring boot·spring cloud
数据知道2 小时前
PostgreSQL 实战:一文掌握如何优雅的进行递归查询?
大数据·数据库·postgresql
陌上丨2 小时前
MySQL8.0高可用集群架构实战
数据库·mysql·架构
Yvonne爱编码2 小时前
Java 接口学习核心难点深度解析
java·开发语言·python
带刺的坐椅2 小时前
Solon AI Remote Skills:开启分布式技能的“感知”时代
java·llm·solon·mcp·skills
重生之绝世牛码2 小时前
Linux软件安装 —— ClickHouse单节点安装(rpm安装、tar安装两种安装方式)
大数据·linux·运维·数据库·clickhouse·软件安装·clickhouse单节点
这周也會开心2 小时前
SSM 配置 index 页面的实现方式
java·tomcat·springmvc
黎雁·泠崖2 小时前
Java继承入门:概念+特点+核心继承规则
java·开发语言
一只自律的鸡2 小时前
【MySQL】第十一章 存储过程和存储函数
数据库·mysql