数据库乐观锁 vs 悲观锁 vs Redis分布式锁:高并发场景下的核心区别与选型指南

289 阅读2分钟

数据库乐观锁 vs 悲观锁 vs Redis分布式锁:高并发场景下的核心区别与选型指南

回答

1、悲观锁
  • 悲观锁,假设最坏的情况。因此,在数据处理之前先加锁

    这种锁通常由数据库自身提供支持,如 MySQL 的 SELECT FOR UPDATE。

  • 主要使用场景

    1. 当数据竞争较多,冲突频繁发生时。
    2. 更新和删除操作多的应用场景。
2、乐观锁
  • 乐观锁,假设多个事务在大多数时间,不会同时修改同一数据

    通常是通过版本号或时间戳来实现。

    每次数据更新过程中,检查版本号或时间戳是否发生变化,

    如果没有变化,则进行更新;

    如果已经变化,则放弃更新或重试。

  • 主要使用场景

    1. 当数据竞争较少,冲突不频繁时。

      乐观锁能减少锁的开销,提高系统的整体性能。

    2. 适用于读多写少的应用场景

3、乐观锁 vs 悲观锁 的区别
  • 乐观锁 适用于读操作频繁,写操作相对较少的场景。

  • 悲观锁 适用于写操作较为频繁,并发写入的概率较高的场景

  • 乐观锁是先干活,后加锁

  • 悲观锁是先加锁,再干活

  • 高并发场景中,建议优先考虑悲观锁

    一般来说,高并发场景中,并发写入的冲突较为频繁。

4、Redis 分布式锁
  • 分布式锁是为了控制分布式系统中多个进程间的执行顺序,用于保护跨多个系统的共享资源。
  • 主要使用场景
    1. 多个应用或服务需要共同访问同一资源时使用。
    2. 适用于处理跨多个节点的业务流程,保证数据的一致性和系统的稳定性。
5、数据库的悲观锁 vs Redis 分布式锁 使用场景的区别?
  • 什么时候用数据库的悲观锁?

    1. 如果,是单体应用在做数据库操作的时候,建议直接基于数据库的悲观锁来做并发控制。
    2. 如果,不想额外引入Redis,直接基于数据库做悲观锁控制。
  • 除以上情况外,建议用 Redis 的分布式锁。主要有几个原因:

    1. Redis更快,性能更好,可以有更快的响应。

    2. Redis 实现的分布式锁功能更多。

      比如 可重入,续期等等,这些都是数据库的悲观锁不支持的。

    3. 数据库悲观锁可能会锁表,影响整体性能。

    4. 建议把非业务逻辑操作放到 Redis 中去抗,而不是用数据库抗。数据库的链接资源要比Redis更加珍贵,