Java资源分享网 - 专业的Java学习网站 学Java,上Java资源分享网
分布式锁的三种实现方式 PDF 下载
发布于:2024-07-18 12:08:28
(假如点击没反应,多刷新两次就OK!)

分布式锁的三种实现方式 PDF 下载  图1

 

 

资料内容:

 

 

分布式锁三种实现方式:
1、基于数据库实现分布式锁;
2、基于缓存(Redis等)实现分布式锁;
3、基于Zookeeper实现分布式锁。从性能角度(从高到低)来看:缓存方式>Zookeeper方式>=数据
库方式
 
一, 基于数据库实现分布式锁
1. 悲观锁
利用select … where … for update 排他锁
注意: 其他附加功能与实现一基本一致,这里需要注意的是“where name=lock ”name字段必须要走索
引,否则会锁表。有些情况下,比如表不大,mysql优化器会不走这个索引,导致锁表问题。
2. 乐观锁
所谓乐观锁与前边最大区别在于基于CAS思想,是不具有互斥性,不会产生锁等待而消耗资源,操作过
程中认为不存在并发冲突,只有update version失败后才能觉察到。我们的抢购、秒杀就是用了这种实
现以防止超卖。
通过增加递增的版本号字段实现乐观锁
 
二, 基于缓存(Redis等)实现分布式锁
1. 使用命令介绍:
1SETNX
SETNX key val:当且仅当key不存在时,set一个keyval的字符串,返回1;若key存在,则什么
都不做,返回0
2expire
expire key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避
免死锁。
3delete
delete key:删除key
在使用Redis实现分布式锁的时候,主要就会使用到这三个命令。
2. 实现思想:
1)获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自
动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。
2)获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
3)释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。