分布式锁的理解

一、概述

在分布式系统中,锁对数据一致性和准确性起到至关重要的作用。

二、分布式带来的问题?

分布式系统相同的服务部署到不同的服务器上,意味着就是多进程服务,多进程和多线程不一样,分布式多进程服务不再同一个物理机器上,因此不能共享堆内存,会产生数据之间不能共享而产生数据一致性问题。为了解决该问题,该如何处理?可以将其标记存储到所有进程都能看得到的地方。

三、分布式锁的实现方式

3.1、基于数据库实现

基于我们操作的数据库是同一数据库,那么不同机器上的不同服务也是处理的同一数据库,因此数据库对他们来说是共享都可见的。

基于数据库的乐观锁:

乐观锁机制其实就是在数据库表中引入一个版本号(version)字段来实现的。当我们要从数据库中读取数据的时候,同时把这个version字段也读出来,如果要对读出来的数据进行更新后写回数据库,则需要将version加1,同时将新的数据与新的version更新到数据表中,且必须在更新的时候同时检查目前数据库里version值是不是之前的那个version,如果是,则正常更新。如果不是,则更新失败,说明在这个过程中有其它的进程去更新过数据了。

基于数据库的悲观锁:

悲观锁就是使用for update,每次更新的时候先加锁,其他进程过来就不能进行更新。除非该进程已经释放锁,因此该锁就是就是分布式锁。

分布式:集群模式下,多个相同的服务部署到不同的服务器上。

3.2、基于redis的实现

加锁:通过设置锁超时时间加锁,如果redis中不存在该Key,就加锁成功,否则加锁失败。

SET resource_namemy_random_value NX PX20000

执行这个命令就 ok。

NX:表示只有 key 不存在的时候才会设置成功。(如果此时 redis 中存在这个 key,那么设置失败,返回 nil)

PX 20000:意思是 20s 后锁自动释放。别人创建的时候如果发现已经有了就不能加锁了。

删除锁:如果在自动释放锁的时间内任务完成,就按照正常流程删除锁。如果未做完,需要开启守护线程,延迟删除锁。当执行完后,再删除锁和显示关掉守护线程。


分布式锁:是指在分布式的部署环境,多个相同服务资源实现共享的情况下,通过锁机制来让多客户端互斥的对共享资源进行访问。

乐观锁:乐观就是料想事情都往好的方向发展。在数据库方面,会有你在修改数据的时候,其他人没有改的想法。

你可能感兴趣的:(分布式锁的理解)