数据库乐观锁和悲观锁、redis分布式锁的使用场景

前言

最近发现我们同事,但凡需要加锁的地方都用的是分布式锁。而且我们的后台系统,并没有什么并发量,而且还是单体应用。我真的有点怀疑我的同事不太清楚数据乐观锁、悲观锁和redis分布式的使用场景。

请今天就说一下各种锁的应用场景吧。

乐观锁和悲观锁、redis分布式锁

悲观锁

悲观锁假设最坏的情况,即在数据处理过程中,总是假设会发生冲突,因此在数据处理之前先加锁。这种锁通常由数据库自身提供支持,如MySQL的SELECT FOR UPDATE。

使用场景:

● 当数据竞争较多,冲突频繁发生时。

● 更新和删除操作多的应用场景。

在高并发场景中,一般来说并发写入的冲突较为频繁,所以建议优先考虑悲观锁。即在做并发操作前,先尝试获取锁,如果获取锁成功,在进行业务操作,否则就直接返回失败。如果用乐观锁,不仅仅有大量执行失败的数据,这部分数据还占用大量的服务器资源(因为前置的数据校验、计算、查询等操作都做完了,最后却失败了)。

乐观锁

乐观锁采用一种宽松的加锁机制,它假设多个事务在大多数时间不会同时修改同一数据。通常是通过版本号或时间戳来实现。每次数据更新过程中,检查版本号或时间戳是否发生变化,如果没有变化,则进行更新;如果已经变化,则放弃更新或重试。

主要使用场景是:

● 当数据竞争较少,冲突不频繁时,乐观锁能减少锁的开销,提高系统的整体性能。

● 适用于读多写少的应用场景。

之前写过一篇文章【最近发现同事的代码问题(第二篇)】其中就使用了观锁的案例,详情见问题一

Redis分布式锁

分布式锁是为了控制分布式系统中多个进程间的执行顺序,用于保护跨多个系统的共享资源。数据库的锁,也是分布式锁的实现方式的一种。因为Redis有更好的性能,并且一般服务器的性能瓶颈 在数据库,所以用Redis来做分布式锁性能好 的同时也能帮数据库分担压力

分布式锁的主要使用场景:

● 在多个应用或服务需要共同访问同一资源时使用,如在微服务架构中保护共享资源。

● 适用于处理跨多个节点的业务流程,保证数据的一致性和系统的稳定性。

也就是说,用数据库悲观锁的地方,都可以用Redis分布式锁。当然Redis也支持乐观锁。但是一般用的比较少而已。

什么时候用数据库的悲观锁,什么时候用Redis的分布式锁呢?

数据库悲观锁

  1. 如果是单体应用(且并发低),在做数据库操作的时候,建议直接基于数据库的悲观锁来做并发控制。如果是分布式应用,二者都可以。
  2. 并发不高的情况,如果不想额外引入Redis,也可以直接基于数据库做悲观锁控制。

redis分布式锁

当然在分布式系统中,由于业务没啥并发,也是可以数据的悲观锁,来加锁的。

在分布式系统中,做并发控制的时候,建议用Redis的分布式锁,而不是数据库的悲观锁(分布式锁)。主要有几个原因:

  1. Redis更快,性能更好,可以有更快的响应。
  2. Redis实现的分布式锁功能更多,比如可重入,续期等等,这些都是数据库的悲观锁不支持的。
  3. 数据库悲观锁可能会锁表,影响整体性能。
  4. 数据库的链接资源要比Redis更加珍贵,建议把这些非业务逻辑操作放到Redis中去抗,而不是用数据库抗。

总结

简单的介绍了乐观锁和悲观,以及基于redis实现分布式锁,对应的应用场景。让我们在实际开发中能够合理的去选择锁方案。

希望这篇文章对你有用,感谢佬们点赞收藏,谢谢!!!

ps: 买服务器返点;收徒中;面试全集在线文档,需要请私信。

相关推荐
程序员阿黄9 小时前
基于 Django 与 Vue 3 的智能实验室预约系统设计与实现
后端·python·mysql·django·vue·毕设
打工仔折腾 AI9 小时前
用 Shell 脚本自动部署 mysqld_exporter 并接入 Prometheus 远程抓取
人工智能·后端·python·性能优化·ai agent 实战
毅炼9 小时前
不写多语言 SDK,怎么让 Python、Go、Node 服务接入注册中心?
java·后端·系统架构·gateway
Methy9 小时前
IoTHub半个月崩了五次?都是裸rethrow惹的祸
服务器·c++·后端
我不会起名字32210 小时前
一天一道力扣Hot100(36):深度优先算法---组合总和
数据结构·c++·后端·python·算法·go
回家路上绕了弯10 小时前
AI 编程助手为什么反复读取同一份上下文?如何减少无效重复
后端
Lost of 程序猿10 小时前
用 Quartz.NET 优雅地处理 .NET 定时任务:从选型到 Docker 部署全记录
后端·c#·asp.net
名字还没想好☜10 小时前
Spring Boot 优雅停机实战:等在途请求处理完再退出,配合 K8s preStop 别丢请求
java·后端·spring
摇滚侠10 小时前
《Spring Boot 3:高级与架构设计》第 1 章 Bean 与 BeanDefinition 个人理解 2
java·spring boot·笔记·后端
IT_陈寒10 小时前
Redis主从切换竟让业务卡了3秒?这个坑我替你踩了
前端·人工智能·后端