1、基于数据库实现分布式锁
悲观锁 利用select … where … for update 排他锁
乐观锁 乐观锁与前边最大区别在于基于CAS思想,是不具有互斥性,不会产生锁等待而消耗资源(版本号字段)
2、基于缓存(Redis等)实现分布式锁
加锁和释放锁都必须是原子操作(释放锁lua脚本)
加锁时带超时时间和是否设置成功的返回判断。
3、基于Zookeeper实现分布式锁
临时、有序的目录。
zk的目录节点有永久、临时类型,有序、无序类型。分布式锁使用的是临时有序目录,创建目录发现顺序不是最小的,添加事件监听前一个节点的删除事件,每个处理完删除自己的节点。zk通过客户端发心跳检测是否断开,用临时节点可以避免死锁。