Redis同步操作与异步操作详解
ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花
一、核心判定标准(先厘清概念)
Redis的同步/异步,核心看命令/任务由谁执行、是否阻塞主线程:
- 同步操作:由Redis单线程主线程串行执行,客户端发起请求后会阻塞等待服务端返回结果,执行完毕才会处理下一条命令,保证指令执行的原子性和顺序性;即使是耗时遍历类命令,全程仍由主线程处理,属于同步范畴。
- 异步操作:由Redis后台线程/子进程独立执行,不阻塞主线程处理客户端请求,任务提交后主线程立即返回,后台默默完成执行,属于“非阻塞、最终完成”模式;部分异步任务存在极短暂的主线程准备阶段(如fork),不改变整体异步属性。
注意:此处区分的是Redis服务端执行层面的同步/异步,而非客户端API的异步调用(如Jedis异步客户端、Lettuce异步连接)。
二、Redis同步操作(主线程执行,客户端阻塞)
绝大多数日常读写、管控、脚本、遍历命令均为同步操作,是Redis的核心执行模式,保证数据一致性和指令可靠性。
1. 基础键生命周期操作
这类命令直接操作键的存在、过期、值读写,全程由主线程执行,客户端需等待响应:
- 读写命令:GET、SET、MGET、MSET、APPEND、STRLEN等
- 键管理命令:DEL(同步删除,大键会阻塞主线程)、EXPIRE、PEXPIRE、PERSIST、EXISTS、TYPE、RENAME、RENAMENX
- 原子操作:INCR、INCRBY、DECR、DECRBY、GETSET、INCRBYFLOAT
2. 五大核心数据结构全量读写命令
针对字符串、哈希、列表、集合、有序集合的所有读写、查询、修改指令,均为同步执行:
- 哈希:HGET、HSET、HMSET、HDEL、HKEYS、HVALS、HGETALL、HINCRBY
- 列表:LPUSH、RPUSH、LPOP、RPOP、LRANGE、LSET、LINSERT、LLEN、LTRIM
- 集合:SADD、SREM、SMEMBERS、SISMEMBER、SCARD、SUNION、SINTER、SDIFF
- 有序集合:ZADD、ZREM、ZRANGE、ZSCORE、ZINCRBY、ZRANK、ZREM_RANGE_BY_RANK
3. 事务与分布式锁相关命令
事务管控、分布式锁实现依赖主线程串行执行,保证原子性,属于同步操作:
- 事务:MULTI、EXEC、DISCARD、WATCH(监控键变化,同步阻塞)、UNWATCH
- 分布式锁:SETNX、SET with NX/EX/PX/XX参数、RedLock相关指令
4. 常规管控与查询命令
服务状态查询、配置修改、连接管控、键遍历命令,主线程即时处理并返回:
- 状态查询:INFO、PING、TIME、DBSIZE、LASTSAVE、ROLE
- 配置操作:CONFIG GET、CONFIG SET、CONFIG REWRITE、CLIENT LIST/KILL/PAUSE
- 键遍历:KEYS、SCAN、HSCAN、SSCAN、ZSCAN(全程主线程迭代,属于同步操作)
5. 脚本与模块执行命令
Lua脚本、Redis模块自定义命令,均由主线程同步执行,阻塞期间不处理其他请求:
- Lua脚本:EVAL、EVALSHA、SCRIPT LOAD/FLUSH/KILL(主线程执行脚本逻辑,同步阻塞)
- 模块命令:MODULE LOAD/UNLOAD/INFO,以及第三方模块自定义指令(主线程同步执行)
6. 发布订阅与强制同步命令
- 订阅类命令:SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE(客户端阻塞等待消息,主线程同步维护订阅关系)
- 强制同步复制:WAIT <副本数> <超时时间>,主线程阻塞直到指定数量从库确认同步完成,将异步复制转为强同步
三、Redis异步操作(后台执行,不阻塞主线程)
这类操作专为避免主线程阻塞设计,提交任务后主线程立即释放,后台线程/子进程独立完成,适合耗时、IO密集型任务;仅存在极短暂的主线程准备阶段,不影响核心服务。
1. 异步删除与清空命令
针对大键、全库清空场景,避免同步DEL/FLUSH阻塞主线程,后台异步释放内存:
- 异步删键:UNLINK(替代DEL,后台线程回收内存,主线程仅标记键删除)
- 异步清空:FLUSHALL ASYNC、FLUSHDB ASYNC(后台渐进式清空数据库,不阻塞读写)
2. 持久化后台异步任务
Redis持久化分为主线程fork(短暂同步阻塞)和子进程执行(完全异步)两个阶段,整体归类为异步操作,子进程落地文件不影响主线程:
- RDB快照:BGSAVE(主线程先同步fork子进程,fork完成后主线程立即恢复服务,子进程后台异步生成RDB文件)
- AOF重写:BGREWRITEAOF(主线程同步fork子进程,子进程后台异步压缩AOF日志、优化文件体积)
- AOF异步刷盘:通过配置<aof-fsync>everysec/always</aof-fsync>,后台线程异步将AOF缓冲区写入磁盘,主线程不等待IO完成
注意:SAVE命令是同步RDB,全程阻塞主线程,属于纯同步操作,生产环境禁用。
3. 主从/集群异步复制
Redis默认采用异步复制,是高可用核心机制,主库不等待从库同步完成,后台异步完成数据同步:
- 主从命令传播:主库执行写命令后,立即返回客户端,后台异步将指令推送给从库
- 全量/增量同步:从库初次连接、断连重连时,主库后台生成快照、同步增量指令,不阻塞主线程
- 集群同步:Redis Cluster槽位迁移、键迁移、节点心跳同步,均为后台异步执行
4. 后台辅助异步任务
Redis内置的周期性后台任务、IO异步任务,由后台线程异步处理,无客户端阻塞,全程不占用主线程资源:
- 过期键淘汰:主线程仅做惰性删除,批量过期键清理由后台异步线程执行
- 内存碎片整理:自动内存碎片回收(activedefrag配置开启),后台异步整理内存,不阻塞主线程
- 客户端IO异步:客户端输出缓冲区写入、网络数据发送,由后台IO线程异步处理
- 日志与监控:慢日志写入、监控数据上报、异常日志落盘,后台异步执行
- 连接资源清理:后台回收异常断开的客户端连接、闲置连接资源
- 发布订阅:PUBLISH命令异步推送消息给订阅者,主线程不等待订阅端响应
四、关键误区澄清(补全盲区)
1. Redis单线程≠无异步:主线程负责核心命令,后台IO线程/子进程负责耗时任务,异步操作是单线程高性能的关键保障。
2. 同步操作≠无延迟:大键同步删除(DEL)、KEYS全量遍历、长Lua脚本,仍会长时间阻塞主线程,建议改用异步命令优化。
3. BGSAVE并非纯异步:fork子进程阶段会短暂同步阻塞主线程(内存越大阻塞越久),子进程生成RDB是完全异步。
4. SCAN属于同步操作:虽为迭代遍历,但每一次迭代均由主线程执行,只是避免了单次全量阻塞,并非后台异步。
5. 异步复制≠数据丢失:通过WAIT命令、合理持久化、集群哨兵配置,可平衡性能和数据一致性,满足不同业务场景。
ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花
本专栏聚焦 Redis Cluster 官方分布式方案,拆解去中心化架构、16384 哈希槽分片、Gossip 协议通信、主从复制与自动故障转移核心原理。从集群搭建、扩缩容实战,到生产环境性能调优、故障排查、高可用设计,覆盖原理剖析、实操步骤、面试高频考点与最佳实践,助力开发者突破单机瓶颈,构建支撑海量数据与高并发的分布式缓存体系,适配电商、社交等业务场景。


查看4道真题和解析