关于分布式锁,网上资料大概有以下几种方式:
1 基于数据库的分布式锁.主要方式是加锁后,数据库中插入一条记录,释放锁后,把记录删掉.
2 基于Zookeeper的分布式锁.
3 基于redis的分布式锁,一种方式是基于SETNX,SETEX,GET,DEL四个命令;另一种方式是利用RedLock算法实现;
以上几种分布式锁各有优缺点,现在笔者的方法是在不存在Zookeeper的环境下,借鉴Zookeeper锁的优点,利用redis实现分布式锁的一种新的方式.详见下述内容:
本方法利用redis中的list实现分布式锁,
步骤如下:
1 定义一个lockList
2 任务执行时,在lockList右侧插入一个随机生成的自己的UUID,即rpush lockList UUID,然后通过命令lrange lockList 0检测list的第一个节点UUID,确认是不是自己,如果是第一个节点,获得锁;如果不是,则监听第一个节点,直到获取锁.
3 任务执行完后,将自己的节点UUID从list头节点中删除,即执行命令lpop lockList.
此方法还有一个好处是可以通过list的长度来限定最大连接数.
应用场景1 :大型订票,购物系统,在高并发情况下,如果系统性能只能支持最多10万个并发,那么就将链表的最大长度设为小于10万,这样就能防止系统瘫痪.如当年大型订票网站,如果这样设计,就不会造成系统瘫痪.