分布式锁的实现
多线程环境下如果不对共享资源进行加锁操作就会出现数据不同步的问题,通常情况下有三种分布式锁的实现,即DB、Redis、zookeeper。
- DB可以基于表记录来实现,创建一张锁表,需要获得锁时插入一条数据,释放锁时删除该记录。但是这种锁没有失效时间,会出现单点问题,而且是非可重入。也可以使用select for update实现排他锁,由于InnoDB 预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL 才会执行行锁 ,否则MySQL 将会执行表锁。
- Redis加锁,就是给key键设置一个值,并定一个过期时间,解锁就是把该键删除。当然也可以直接使用Redisson提高多线程高并发处理能力。
- zookeeper创建临时序列节点来实现分布式锁,适用于顺序执行的程序,大体思路就是创建临时序列节点,找出最小的序列节点,获取分布式锁,程序执行完成之后此序列节点消失,通过watch来监控节点的变化,从剩下的节点的找到最小的序列节点,重复以上操作。