数据库乐观锁 vs 悲观锁 vs Redis分布式锁:高并发场景下的核心区别与选型指南
回答
1、悲观锁
-
悲观锁,假设最坏的情况。因此,在数据处理之前先加锁。
这种锁通常由数据库自身提供支持,如 MySQL 的
SELECT FOR UPDATE。 -
主要使用场景
- 当数据竞争较多,冲突频繁发生时。
- 更新和删除操作多的应用场景。
2、乐观锁
-
乐观锁,假设多个事务在大多数时间,不会同时修改同一数据。
通常是通过版本号或时间戳来实现。
每次数据更新过程中,检查版本号或时间戳是否发生变化,
如果没有变化,则进行更新;
如果已经变化,则放弃更新或重试。
-
主要使用场景
-
当数据竞争较少,冲突不频繁时。
乐观锁能减少锁的开销,提高系统的整体性能。
-
适用于读多写少的应用场景
-
3、乐观锁 vs 悲观锁 的区别
-
乐观锁 适用于读操作频繁,写操作相对较少的场景。
-
悲观锁 适用于写操作较为频繁,并发写入的概率较高的场景
-
乐观锁是先干活,后加锁。
-
悲观锁是先加锁,再干活。
-
高并发场景中,建议优先考虑悲观锁。
一般来说,高并发场景中,并发写入的冲突较为频繁。
4、Redis 分布式锁
- 分布式锁是为了控制分布式系统中多个进程间的执行顺序,用于保护跨多个系统的共享资源。
- 主要使用场景
- 在多个应用或服务需要共同访问同一资源时使用。
- 适用于处理跨多个节点的业务流程,保证数据的一致性和系统的稳定性。
5、数据库的悲观锁 vs Redis 分布式锁 使用场景的区别?
-
什么时候用数据库的悲观锁?
- 如果,是单体应用在做数据库操作的时候,建议直接基于数据库的悲观锁来做并发控制。
- 如果,不想额外引入Redis,直接基于数据库做悲观锁控制。
-
除以上情况外,建议用 Redis 的分布式锁。主要有几个原因:
-
Redis更快,性能更好,可以有更快的响应。
-
Redis 实现的分布式锁功能更多。
比如 可重入,续期等等,这些都是数据库的悲观锁不支持的。
-
数据库悲观锁可能会锁表,影响整体性能。
-
建议把非业务逻辑操作放到 Redis 中去抗,而不是用数据库抗。数据库的链接资源要比Redis更加珍贵,
-