分布式锁的3种实现
参考资料
参考blog 最详细
https://blog.csdn.net/lemon89/article/details/52796775
总结
悲观锁策略更适合读写特别频繁的业务,因为避免了多个线程无效的争夺锁的操作,而乐观锁策略更适合读多写少的策略,可以充分的利用时间。
zk实现
- 临时顺序节点+监听的方式(也是最主要的实现方式)
- 利用节点名字不重复的特性,创建某永久节点,来实现获取锁,然后释放锁的时候,删除该节点。类似于redis的悲观锁策略
redis实现
- 乐观锁:通过watch一个库存,然后,开启事务count–,再提交事务。实现进程安全。
- 悲观锁:通过setnx方法,来实现抢锁,delete实现释放锁,再引入超时机制,即使出现异常线程也能保证业务不停摆
数据库实现
特点:db操作都有一定性能损耗
1.乐观锁的形式:特定一条数据添加版本号,每写一次去check一次版本号;也可以通过唯一性索引的方式,开启事务提交业务代码的同时再出入一个唯一性的锁数据。
2.悲观锁的形式:select * for update的形式锁住一条数据再进行写操作;