Redis分布式锁实现Redisson 15问(五)

pivoteic
发布于 2022-6-17 16:58
浏览
0收藏

 

十二、如何实现读写锁

 

在实际的业务场景中,其实会有很多读多写少的场景,那么对于这种场景来说,使用独占锁来加锁,在高并发场景下会导致大量的线程加锁失败,阻塞,对系统的吞吐量有一定的影响,为了适配这种读多写少的场景,Redisson也实现了读写锁的功能。

 

读写锁的特点:

  • 读与读是共享的,不互斥
  • 读与写互斥
  • 写与写互斥

 

Redisson使用读写锁的代码。

Redis分布式锁实现Redisson 15问(五)-鸿蒙开发者社区

Redisson通过RedissonReadWriteLock类来实现读写锁的功能,通过这个类可以获取到读锁或者写锁,所以真正的加锁的逻辑是由读锁和写锁实现的。

 

那么Redisson是如何具体实现读写锁的呢?

 

前面说过,加锁成功之后会在redis中维护一个hash的数据结构,存储加锁线程和加锁次数。在读写锁的实现中,会往hash数据结构中多维护一个mode的字段,来表示当前加锁的模式。

 

所以能够实现读写锁,最主要是因为维护了一个加锁模式的字段mode,这样有线程来加锁的时候,就能根据当前加锁的模式结合读写的特性来判断要不要让当前来加锁的线程加锁成功。

 

  • 如果没有加锁,那么不论是读锁还是写锁都能加成功,成功之后根据锁的类型维护mode字段。
  • 如果模式是读锁,那么加锁线程是来加读锁的,就让它加锁成功。
  • 如果模式是读锁,那么加锁线程是来加写锁的,就让它加锁失败。
  • 如果模式是写锁,那么加锁线程是来加写锁的,就让它加锁失败(加锁线程自己除外)。
  • 如果模式是写锁,那么加锁线程是来加读锁的,就让它加锁失败(加锁线程自己除外)。

 

十三、如何实现批量加锁(联锁)

 

批量加锁的意思就是同时加几个锁,只有这些锁都算加成功了,才是真正的加锁成功。

 

比如说,在一个下单的业务场景中,同时需要锁定订单、库存、商品,基于这种需要锁多种资源的场景中,Redisson提供了批量加锁的实现,对应的实现类是RedissonMultiLock。

 

Redisson提供了批量加锁使用代码如下。

Redis分布式锁实现Redisson 15问(五)-鸿蒙开发者社区

Redisson对于批量加锁的实现其实很简单,源码如下

Redis分布式锁实现Redisson 15问(五)-鸿蒙开发者社区

就是根据顺序去依次调用传入myLock1、myLock2、myLock3 加锁方法,然后如果都成功加锁了,那么multiLock就算加锁成功。

 

文章转自公众号:三友的java日记

标签
已于2022-6-17 16:58:10修改
收藏
回复
举报
回复
    相关推荐