Redisson的使用与可重入锁

发布于:2022-12-29 ⋅ 阅读:(517) ⋅ 点赞:(0)

目录

一、Redisson的使用

1.Redisson

 2.导入依赖

3.建立Redssion配置类

4.使用

二、redisson的可重入锁

1.基本原理

2.test

3.图示


一、Redisson的使用

1.Redisson

Redisson是一个在Redis的基础上实现的Java驻内存管理网络(In-Memory Data Gird), 它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包括了各种分布式的实现。

8.分布式锁(Lock)和同步器(Synchronizer)

        8.1.可重入锁(Reentrant Lock)

        8.2.公平锁(Fair Lock)08.3.联锁(MultiLock)

        8.4.红锁(RedLock)
        8.5.读写锁(ReadWriteLock)

        8.6.信号量(Semaphore)
        8.7.可过期性信号量(PermitExpirableSemaphore)

        8.8.闭锁(CountDownLatch)

官网地址:Redisson: Redis Java client with features of In-Memory Data Grid 

GitHub地址:GitHub - redisson/redisson: Redisson - Redis Java client with features of In-Memory Data Grid. Over 50 Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Publish / Subscribe, Bloom filter, Spring Cache, Tomcat, Scheduler, JCache API, Hibernate, MyBatis, RPC, local cache ...

 2.导入依赖

这里我们使用maven管理依赖,先导入依赖

        <!--redisson-->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.13.6</version>
        </dependency>

3.建立Redssion配置类

    public class RedissonConfig {

        public RedissonClient createRedisson() {
            //配置
            Config config = new Config();
		    //useSingleServer指的是单例模式,设置redis地址,端口号,密码                        
config.useSingleServer().setAddress("redis://192.68.23.100:6379").setPassword("zjy123...000");
            //创建RedissonClient对象
            return Redisson.create(config);
    }
}

4.使用

        //使用
		@Resource
   		private RedissonClient redissonClient;
   		//例子:
   		RLock lock = redissonClient.getLock("lock");
        //获取锁
        boolean isLock = lock.tryLock();
        
        //执行业务

        //释放锁
        lock.unlock("lock");

二、redisson的可重入锁

1.基本原理

利用redis的hash结构存储锁,key值随意,field属性为线程标识,value为锁次数。当线程获取一次锁后,如果此时redis中没有这个锁,则创建并将锁次数置为1;接下来如果线程再次获取锁会进行一次判断。即对比线程标识是否是同一个线程的多次获取,如果是的话锁次数+1。同样的,如果是释放锁的话也需要对线程标识进行判断,然后让对应的锁次数-1,当锁的次数为0时,表示此时可以删除锁了。

2.test

@SpringBootTest
class RedissonTest {
    @Resource
    private RedissonClient redissonClient;

    private RLock lock;

    @BeforeEach
    void setup() {
        //对锁进行初始化
        lock = redissonClient.getLock("lock");
    }
    
    // 方法A
    @Test
    void A() {
        //尝试获取锁
        boolean isLock = lock.tryLock();
        if(!isLock) {
            System.out.println("获取锁失败。。。1");
            return;
        }
        try {
            System.out.println("获取锁成功。。。1");
            // 获取锁后调用方法B
            B();
            System.out.println("开始执行业务。。。1");
        } finally {
            System.out.println("准备释放锁。。。1");
            lock.unlock();
        }
    }

    void B() {
        //尝试获取锁
        boolean isLock = lock.tryLock();
        if(!isLock) {
            System.out.println("获取锁失败。。。2");
            return;
        }
        try {
            System.out.println("获取锁成功。。。2");
            System.out.println("开始执行业务。。。2");
        } finally {
            System.out.println("准备释放锁。。。2");
            lock.unlock();
        }
    }

}

//运行结果
/*
获取锁成功。。。1
获取锁成功。。。2
开始执行业务。。。2
准备释放锁。。。2
开始执行业务。。。1
准备释放锁。。。1
*/

由于执行完成后锁已经被删除,redis内无法看到,所以我们打断点查看一下:
 

断点1:

 

 

断点2:

 可以看到此时锁次数变为2。

断点3:

此时方法B执行完,释放了一次锁,锁的次数变为1。

 3.图示

 

本文含有隐藏内容,请 开通VIP 后查看