锁场景
单机部署时,锁机制可用
ReentrantLock
可重入锁,或者用synchronized特殊字段锁住,高并发时推荐使用ReentrantLock,效率更高分布式部署时,因为需要布置多个服务器,不同服务器之间锁不互通,所以需要一个共同的中间件去达成锁的通信,推荐只用redis,当然还有数据库的悲观锁、乐观锁
redis分布式锁
- 原理:
setnx+expire
,并开启事务(使其具有原子性),两项操作必须都执行成功,一项操作失败,另一项操作也需回退,执行完后del
释放锁 - 保证事务方法:使用lua脚本(经常使用在游戏上,效率非常高),该脚本拥有原子性
- 上述分布式锁可能发生的问题
- redis挂了========>可以高可用集群
- 超时时间设置========>根据你的业务时间来进行配置
- 业务时间>超时时间=========> 自动续钟(定义一个守护线程:查看锁的过期时间,如果发现锁要过期,但业务还没完成,则自动加时间)
使用redisson来实现
官方提供的redis分布式锁的实现
步骤
- pom包引入redisson的实现