游乐游手机版
首页/数据库/文章详情

Redis常用命令详解:基础、进阶与场景化实战案例

时间:2026-06-14 07:04
从基础通用命令到核心数据类型操作(String、Hash、List、Set、ZSet),再到事务、分布式锁、发布订阅、持久化及批量操作,全面梳理Redis命令体系。涵盖键管理、性能优化、并发控制及场景化工具,帮助高效应对各类业务需求。

Redis 常用命令全解析:基础、进阶与场景化实战

在 Redis 的日常使用中,命令就是最直接的操作工具。不管是刚入门还是长期维护,掌握一套成体系的命令,能让你在面对各种业务场景时游刃有余。下面就从最基础的通用命令开始,逐步深入到数据类型、事务、分布式锁,再到 Geo、Bitmaps 和 HyperLogLog 这些场景化工具,争取把 Redis 的命令体系一次性理清楚。

一、基础通用命令

这些命令不挑数据类型,适用于所有场景。它们的主要作用是管理键、查看运行状态,是每次操作 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 这五种核心类型掰开揉碎,看看每个类型的常用命令。

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,生产环境首选),分批返回键,避免阻塞 RedisSCAN 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 事务可以保证命令的原子性执行,而 SETNXGETSETRedlock 是实现分布式锁的核心工具。 **(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。
来源:https://www.jb51.net/database/3575921s6.htm
上一篇Redis分布式锁8大常见问题与解决方案全解析 下一篇Redis五种核心数据类型及命令示例
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Redis 7.0增量AOF重写RDB前导码配置详解
数据库 · 2026-07-02

Redis 7.0增量AOF重写RDB前导码配置详解

先说一个几乎所有人都踩过的典型误区:很多人把 aof-use-rdb-preamble yes 当作开启“增量重写”的开关。实际上,这个配置只干了一件事——让重写后的 AOF 文件头部带上 RDB 快照。它解决的是加载速度问题,跟“增量重写”本身的概念压根不是一回事。真正的增量重写,依赖的是 Red

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践
数据库 · 2026-07-02

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践

直接在Tornado里用SQLAlchemy同步执行SQL,结果就是阻塞IOLoop,所谓“异步框架里写同步数据库代码”,等于白搭。安全执行的关键不是“怎么写SQL”,而是“怎么不卡住事件循环”。 为什么不能在RequestHandler里直接调用session execute() 因为sessio

利用SQL触发器实现在INSERT数据时自动同步到审计表
数据库 · 2026-07-02

利用SQL触发器实现在INSERT数据时自动同步到审计表

先说结论:可以用触发器把 INSERT 数据同步到审计表,但必须用 AFTER INSERT,并且审计表的字段顺序、类型、字符集得和源表严格一致。否则,轻则写入错位、数据截断,重则直接报错、丢数据。下面把这些坑一个一个掰开说。 能,但必须用 AFTER INSERT,且审计表字段顺序、类型、字符集要

如何用SQL编写按不同工作日统计员工出勤率
数据库 · 2026-07-02

如何用SQL编写按不同工作日统计员工出勤率

在实际业务中,统计不同工作日的出勤率是HR系统里的高频需求。如果直接按日期函数分组,很容易掉进语言环境、索引失效或分母口径的坑里。下面就来拆解具体的实现要点。 必须用 CASE WHEN 将日期映射为固定 weekday 标签(如 Mon )再分组,避免语言环境导致的分组断裂;需过滤 DOW IN

Spring Boot 3动态拼接SQL为何引发严重安全漏洞
数据库 · 2026-07-02

Spring Boot 3动态拼接SQL为何引发严重安全漏洞

SQL注入漏洞的核心成因,本质上是因为用户输入直接参与了SQL语句的字符串拼接,而未采用参数化绑定机制。在MyBatis中使用${}、QueryWrapper中调用apply()与last()、JPA的@Query注解进行拼接等操作,都会绕过PreparedStatement的安全防护。动态字段必须