日推笔记

253 阅读2分钟

==记录每天看的推文,记录笔记,防止遗忘,持续更新,只写出要点,不贴外链,详细百度==

# 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订单处理
  • 延时队列任务