前几天和几个做微服务架构的朋友讨论方案,有人突然问了一句:“项目里已经引入了 Seata,为什么还要用 Redisson 的分布式锁?这俩功能不是重复吗?二选一是不是就够了?”这个问题当时让讨论停滞了几秒,因为它确实不是个冷门疑问。我在不少团队的架构评审会上也见过类似的场景:画架构图时,Redisson 出现在分布式协调的格子里,Seata 出现在分布式事务的格子里,然后自然而然就有人冒出一句“看着像重复了”。
这个问题如果只看组件名和网上的碎片文章,确实容易被绕进去。但如果真在业务里跑过一段时间,就会知道这两者完全不是一回事。我先讲一段自己的经历:有一年我给一个促销系统做瘦身,为了减少中间件依赖,把 Redisson 的锁拿掉,想着“只要 Seata 能保证事务,数据就不会出问题”,结果压测阶段库存直接被扣成了负数。那次事故让我彻底想明白了一个结论——Redisson 和 Seata 不是替代关系,它们解决的是两个维度的问题。
今天这篇就把两者分别负责什么、为什么会被误读、真实场景里怎么搭配,以及我在选型和踩坑过程中积累的判断方式,一次性说清楚。
1. 误解从哪儿来:Redisson 和 Seata 被混为一谈
我第一次见到有人把这两个组件放在一起对比时,第一反应是有点懵。因为在我平时的设计习惯里,Redisson 是放在“并发控制与协调”这个分类下的,而 Seata 是放在“数据一致性保障”这个分类下的,两者平时根本不会放在同一个技术选项里去评比。但既然这个问题反复出现,就说明它的产生有必然性,不是个别现象。
1.1 面试里那个高频问题:“有了 Seata 还需要分布式锁吗”
很多把两者搞混的同学,最先接触它们是在面试题库里。搜索“Redisson 和 Seata”相关的热搜词,后面往往跟着“分布式锁”“分布式事务”“微服务架构”“Seata 面试题”这些标签。在面试题和底层原理文章里,分布式锁和分布式事务经常被放在同一个大的“分布式问题”分类下面。一个人如果先看了一遍 Redis 实现分布式锁的原理,又看了一遍 Seata AT 模式的原理,很容易在心里形成一个模糊的印象:都是解决分布式引入的问题,都是保证一致性,也许本质上是同一件事的不同叫法?
但实际上,面试题把它们放在一起,只是因为它们都属于“分布式架构中常见的高频问题”,不代表它们是同一种解决方案。类比一下:你在驾校学了倒车入库,也学了侧方停车,它们都是停车技术,可你不可能用倒车入库去处理侧方停车位,反之亦然。锁和事务在分布式系统里面对的“车位”根本不一样。
1.2 “锁”和“事务”在语义上被归到了同一个技术问题
锁解决的是一个很朴素的冲突问题:多个进程要修改同一份数据时,得保证同一时刻只有一个进程在改。你可以把它想象成公共厕所门口的红绿灯,红灯亮的时候只有一个人能进去,其他人在外面排队。这是并发互斥的问题。
事务解决的是另一件事:一系列操作要么全部成功,要么全部失败。想象你在整理一条走廊,要把五扇门都关上并且锁好,如果关到第三扇门时发现锁坏了,前面两扇已经关上的门也要重新打开,不能让走廊处于“一半门关了、一半门没关”的状态。这是原子性和一致性的问题。
红绿灯管的是谁能进门,走廊管理管的是五扇门是不是都能保持一致状态。这两个问题本身不冲突,也不重叠。但在分布式架构的语境下,大家开口闭口都是“分布式一致性”,就容易把“数据并发互斥”和“事务一致性”这两件事混在一个大帽子里,以为既然帽子是同一个,那下面的工具自然也重复了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Redisson 的实际定位:解决进程间的资源竞争
Redsisson 本质上是一个基于 Redis 实现的 Java 客户端库,但它不是普通的那种 get/set 的缓存客户端。它提供了大量分布式组件,其中最出名的就是分布式锁。我用它主要解决的是进程之间“抢资源”的问题。
2.1 Redisson 实际提供的能力:从 RLock 到限流器
先梳理一下 Redisson 在真实项目里被用到的几个高频组件,这样能清晰看到它的职责边界:
- RLock:可重入分布式锁,也是用得最多的能力。支持自动续期(watch dog),默认锁超时时间是 30 秒,业务没执行完会自动延长锁的持有时间。
- RReadWriteLock:读写锁,适合读多写少场景,读锁之间互不阻塞,写锁独占。
- RSemaphore:分布式信号量,可以控制同时访问某个资源的线程数,比如限制同一时刻只能有 N 个请求去调用外部接口。
- RRat
