redis分布式锁
1、 redis阻塞锁:stackexchange客户端有实现AcquireLock(key,timeout)方法,key就是标识,timeout表示拿到锁之后可以占用多久,或者没拿到锁等待多久。
缺点是timeout参数不好把握
2、 redis非阻塞锁:如果没有拿到锁,给用户返回失败,代码不自动重试,把重试操作交给用户。
3、 redlock: 阻塞锁、非阻塞锁都是redis单机节点,如果redis挂了,业务就失败了。但是针对redis集群,也无法避免,当我们请求一个分布式锁的时候,成功了,但是这时候slave还没有复制我们的锁,master Down了,我们的应用继续请求锁的时候,会从继任了master的原slave上申请,也会成功。
所以不使用集群,假设有5个redis节点,这些节点之间既没有主从,也没有集群关系。客户端用相同的key和随机值在5个节点上请求锁,请求锁的超时时间应小于锁自动释放时间。当在3个(超过半数)redis上请求到锁的时候,才算是真正获取到了锁。如果没有获取到锁,则把部分已锁的redis释放掉