- 分布式锁
1)redis分布式锁
- :使用 避免库存超卖 多个服务,多个线程进来访问一个库存共享资源,进行加锁。
导入Redisson的依赖
RLock rlock=redisson.getLock(key);
rlock.lock();
rlock.ulock();
- :实现原理图
- lua脚本
-
- :看门狗,就是获取了锁 送你一条狗 狗按时去检查,检查你发现还在 就给你延长时间。
- :释放锁
Rlock.unlock去释放 就是给那个次数-1,为0的时候 就删除掉这个key,然后下个客户端去判断这个key 他就可以加锁了。
高并发情况下: 400台手机,串行去扣减库存 排队排死。
首先 基于Nginx限流,setinl框架限流,然后在基于库存 生成令牌限流。
A):类似于ConcurrentHashMap,分段锁概念,我给我库存分发到不同的分片上,然后给一个分片进行上锁就可以了 这样多个分片同时进行卖库存。
这样子并发就上来了一部分。
2)ZK分布式锁
- :持久节点,临时节点,顺序节点。
3)redis分布式锁与ZK分布式锁的区别?
Redis:
A)获取不到锁的线程,就不断去循环去尝试获取锁,比较消耗性能。
B)redis性能高,集群可能会导致选举 出现数据不一致,当然也可以开启持久化。
C)redis如果客户端挂了,需要等到过期时间 才会释放锁。
ZK:
- 具有强一致性 ZAB算法
- 如果获取不到锁,不会去循环去尝试,具有监听机制。
- Zk客户端挂了,他的临时节点会自动删除,然后释放锁。
选型的话:项目有redis就用redis,没有必要单独搭建ZK做分布式锁。