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集群 文章被收录于专栏

本专栏聚焦 Redis Cluster 官方分布式方案,拆解去中心化架构、16384 哈希槽分片、Gossip 协议通信、主从复制与自动故障转移核心原理。从集群搭建、扩缩容实战,到生产环境性能调优、故障排查、高可用设计,覆盖原理剖析、实操步骤、面试高频考点与最佳实践,助力开发者突破单机瓶颈,构建支撑海量数据与高并发的分布式缓存体系,适配电商、社交等业务场景。

全部评论

相关推荐

杂七杂八的个人感受和思考。写于2026&nbsp;3月20主题是公司大神多➕论装逼字节的人才浓度在国内是数一数二的,人又是环境的产物,在一堆优秀的人旁边做事,就是会有一种把你往前推,不行也得行,装也得装行的感觉。最近在公司内部看了很多文章,了解了那些真正有思考有想法的人是怎么看待事情的,是怎么做事的。其实感触挺大的,因为我已经很久很久没有静下心来看书思考还有复盘总结过去的一些经验了。似乎有点落后了,落后于ai时代,落后于真正优秀的人群了,人生是一场长跑,并非是抢跑,保持思考,继续向前。在过去几年,我算得上比较努力,努力的原因有很多种,其中有一种比较奇葩,就是我想装逼,就是想着诶毕业后进腾讯,去那个滨海大厦拍照发朋友圈,可装逼了。也就是特别想证明自己,特别想告诉别人我是很厉害的,后面我也确实是这样做的。去美团字节,我都喜欢去装逼,发抖音发小红书发牛客,一边写着经验贴一边装逼,刚开始确实特别爽,爽到爆炸(没装过的人有机会可以装一下试试)现在想来,其实确实没啥装的必要,仔细审视自己,为什么就那么想装逼呢?虚荣心咋这么强呢?分析了过往成长的一些经历,得到了答案最初期我的家庭教育就是偏打压型,一直在家里都是被说不行,这不行那不行,后面6年都是进的全市最好的中学,每次考试完都会公开成绩,当众鞭尸,我几乎就是吊车尾,而且当时是分数越少,下次就会分配越高层的考场,我很多次都在最高的那一两层考试(象牙塔也是看成绩分阶级哈哈哈),其次就是喜欢的女生,每次我都是苦了吧唧当舔狗的,以为自己很深情有机会,最后别人都选了更强的男生。无论是在家里被打压,在学校被分最低阶级,在两性关系里竞争失败,无疑一次次都在证明着自己是个不行的人,而好巧不巧,我是个自尊心很强的人,所以一直都憋着一口气,想要证明他妈的谁敢说我不行。所以最后还是那句话,人越缺什么,越想证明什么。以前的被人小瞧,回过头来就会总想着取得成绩以后回来打他们的脸。不过现在看来已经是云淡风轻了,这是小屁孩短期的一种虚荣心变现,长久下去,得到的不会是满足,而是空虚。当时在牛客抖音这些平台,得有几百上千个人说我牛逼,说我是他们的榜样,我本以为我会很爽,可实际上我没啥感觉,我对这种夸奖已经脱敏了,甚至我还有点讨厌别人老拿大厂说事,不能正常说话老是叫什么xx爷......从那时候我就发现自己长大了一些,不再过分追求这种所谓的虚荣心。没有虚荣心带来的爽感之后,感觉生活有点空虚了。后面阴差阳错发现让我更爽,更愉悦的事情就是尽可能地输出、与他人做链接、尽可能地帮助别人,这样就可以在自我实现这个顶层需求上实现满足,从而带来高级的愉悦感。多输出一些,就会遇到新朋友,这也是一件开心的事情,不是吗?我后面在社交媒体发布的一些内容,都是按照利他思维在做,很多人能从我的文字中找到共鸣,得到鼓励,并且私聊跟我表示感谢,这种幸福感和简单装逼带来的虚荣心满足很不一样,简单一点就是更爽了,同时也认识了一些新朋友,也得到了一些前辈的制造,简直百利而无一害总结一下,装逼确实爽,但只是较浅层满足虚荣心的爽,久而久之会觉得空虚,并且装逼容易惹人讨厌,影响人际关系,但是输出价值,链接他人,帮助他人就不一样了,这种幸福感是会更强烈也会更持续的......
点赞 评论 收藏
分享
目前是郑州大学的研二,想要找大数据开发的工作,目前没有实习,现在已经学了ssg的离线数仓,能找到暑期实习吗?我是应该坚持找暑期实习还是再学一下实时数仓。
睡不着的二进制:熟悉八股,数仓架构,组建原理,手撕sql,准备的差不多百分之60道80就可以投递,前提简历准备好,边面试边准备边查漏补缺
点赞 评论 收藏
分享
02-25 16:55
已编辑
北京工业大学 Java
211本,找日常实习的话,如果面向中厂的话,需要刷hot100么?因为之前从来没刷过,算法仅限于学校课程水平,准备3月投递简历,现在还需要背八股文,时间有些紧张,还需要刷算法题么?同时什么样的公司可以算是中厂呢?
程序员小白条:中大厂说的上名字的,必定要算法,hot100只是最基础的了,题库远不止100题捏,一般在300-400题量之间,算法=学校课程=简单题也做不出,多准备八股文和算法吧,其他项目可以放放,精刷算法就行了,花时间成长很快的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务