高并发分布式锁--Redis之Redisson和优化

拒绝东扯西扯,直接上干货

这里只讲原理,如果想了解redisson使用过程的请看看Redisson的官网。

 

优势

redisson分布式锁优势

  1. 多个redis操作乱脚本整体提交,保证性能同时,保证整体原子性!
  2. 看门狗自动延续锁生命周期,防止未处理完锁过期问题,但是同时造成了阻塞,甚至锁死
  3. 实现了自旋锁 :发现锁后get ttl进行while true对应的时间
  4. 实现了重入锁 :发现锁后再看一下clientid是不是自己,如果是+1

 

原理

redisson分布式锁使用例子

1

2

3

4

5

RLock lock = redisson.getLock("myLock");

//加锁

lock.lock();

// 解锁

lock.unlock();

架构图

高并发分布式锁--Redis之Redisson和优化

lua脚本流程图

高并发分布式锁--Redis之Redisson和优化

lua加锁脚本源码:

高并发分布式锁--Redis之Redisson和优化

 

redisson分布式锁 问题:

自多续期怎么防止长期阻塞,甚至死锁,这里大家思考一下,欢迎留言

 

优化

高性能分布式锁优化( 核心思想:分段)

分段锁:我们常用的是按商品,按商家等进行分段;但是在秒杀的时候,秒的就是一个商品,那么我们怎么进行分布式锁优化呢? 思考一下。。。。

如果我们锁的是商品库存,防止超卖问题,那么我们的思路是,把库存数量 分段:

       1000分成20段,那每段就是50个库存。

       这样我们的锁 锁的是 一个库存段, 就能对同一个商品的多个库存段实现分段锁,实现同一个商品的并发

问题:如果秒杀的锁并不是仅仅锁库存呢? 这里建议 分成多个锁

访问流程如下:

取到一个分段:这里可以随机取,也可以继续优化(看下文)

高并发分布式锁--Redis之Redisson和优化

直到取到 无锁 且 库存足够 的分段为止

 

问题:秒杀一般只能是一个,这里考虑的是并发非常高的非秒杀场景

  • 如何快速获取到库存足的分段
  • 购买库存大于最大分段库存,但是小于总库存怎么实现购买

快速获取库存足的分段:

    粗略维护各段的库存总量,返回量够的分段,再去获取锁;获取锁失败,再用库存够的段去重试

    如果库存不够就不去尝试获取锁了

购买库存大于最大分段库存

    实现起来就更复杂了,思路是设计一个总库存的锁。当获取不到足够库存的分段时,通过总库存去实现下单

    这个方法:会锁所有分段  更好 的实现方式欢迎大家留言