常用的redis分布式锁实现方式
以上方式可能会出现一些问题:
在高并发的情况下,每个线程的执行顺序是不可预估的,当前线程抢占的锁可能被其它的锁给释放掉,应将上述代码修改成如下:
以上方案还是会出现一些问题,比如锁失效时间不好把握,所以我们还要继续优化,一般一线大厂他们后台会启动一个异步线程去监控这个key是否存在,如果存在则会延长失效时间
使用redisson:
三行代码实现锁:
原理:
底层是通过lua脚本语言实现:
redis是满足AP的,保证可用性,但是不保证一致性,因为在redis同步数据到从节点的时候,如果主节点宕机会导致数据丢失
zookeeper是满足CP的,保证了一致性但是不保证可用性,因为zk在选举的时候通过ZAB协议
redisLock实现原理:
redisLock和zk实现原理是类似的,也是cp原理,客户端需要发送多个加锁命令到不同的redis分片中,只要有过半的redis回应客户端成功,那么就代表加锁成功,但是这样会消耗性能