==记录每天看的推文,记录笔记,防止遗忘,持续更新,只写出要点,不贴外链,详细百度==
# 3、redis-分布式锁
环境
单机或者集群环境redis集群、多个服务实现同步锁
思考
- 1、setnx 如果key不存在,保存value并返回1。如果key存在,不保存value,返回0
加锁: set test1 123 nx 解锁: del
问题:如果获取到锁后死机,锁将无法释放复制代码
- 2、加上过期时间
SET lockKey value NX EX 30
问题:A获取到锁后,处理时间过长超过过期时间,B获取到锁,A处理结束,释放了B的锁复制代码
- 3、value 标识属于当前线程的UUID,若非当前线程的value不删除
问题:1、操作,判断是否属于当前线程,之后删除并不是原子操作,写lua脚本,jedis.eval() 执行脚本。 2、过期时间大于业务处理时间复制代码
总结
1、setnx判断,设置过期时间,判断当前线程
集群redis的分布式锁
RedLock算法
其他
Zookeeper 分布式锁
# 2、一致性Hash
怎么使用hash
- 集群分布式存储,直接读取对应数据的服务器
- 例如redis集群,计算hash值保存对应的服务器,之后根据hash计算读取,算法:hash%(服务器个数)
什么是一致性执行性hash
- 服务器移除或新增,普通hsah算法不准确,内存雪崩
- 将服务器计算hash值映射2^32环形hash值上,hash(str)%(2^32-1) 得到距离计算值最近的服务器hash编号
- 可能会出现HASH环数据倾斜,可以计算服务器多个hash值
# 1、高性能队列Disruptor
高性能的原因
- 环形数组数据结构
- 消除计算机层面上的伪共享
- 使用CAS无锁同步
实例使用
- 创建生产者
- 创建消费者
- 注意点:防止消息堆积,内存消耗
应用场景
- netty和Disruptor配合做定位
- 单线程最大600W订单处理
- 延时队列任务