Redisson的使用与可重入锁

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 介绍Redisson以及Redisson中的可重入锁的原理

 目录

一、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>

image.gif

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);
    }
}

image.gif

4.使用

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

image.gif

二、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
*/

image.gif

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

 

断点1:

image.gifimage.png

image.png

 

断点2:

image.png

image.png

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

断点3:

image.png

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

image.png

3.图示

image.png


目录
相关文章
|
负载均衡 架构师 Java
详细讲解OpenFeign的使用姿势!
学会使用Feign最贱优雅地调用服务
23346 9
详细讲解OpenFeign的使用姿势!
|
SQL 数据可视化 前端开发
Springboot 整合 xxljob 使用定时任务调度(新手入门篇)
Springboot 整合 xxljob 使用定时任务调度(新手入门篇)
2130 0
Springboot 整合 xxljob 使用定时任务调度(新手入门篇)
|
存储 运维 NoSQL
Redisson可重入锁原理
Redisson提供的分布式锁是可重入的,它使用的是Hset命令和Hash数据结构。
Redisson可重入锁原理
|
SQL 监控 Java
深入浅出Mybatis拦截器
我们平时所谈的拦截器与过滤器有什么区别?我们在使用Mybatis时候,如果想动态的改写sql如何实现?倘若在多租户的系统中,如何依据当前的线程上下文中的请求租户信息,动态的改写sq设置租户信息?又或者如何增加sql的执行耗时或者信息摘要呢?
4137 1
|
存储 NoSQL 调度
Redis Lua脚本:原子性的真相揭秘
【4月更文挑战第20天】
1703 0
Redis Lua脚本:原子性的真相揭秘
|
NoSQL Java 网络安全
在spring中操作Redis
在spring中操作Redis
210 0
|
消息中间件 Kafka RocketMQ
Kafka重平衡机制
当集群中有新成员加入,或者某些主题增加了分区之后,消费者是怎么进行重新分配分区再进行消费的?这里就涉及到重平衡(Rebalance)的概念,下面我就给大家讲解一下什么是 Kafka 重平衡机制,我尽量做到图文并茂通俗易懂。
1899 0
Kafka重平衡机制
|
存储 消息中间件 缓存
RocketMQ如何保证消息的可靠性?
消息的发送方式有哪几种?存储消息的可靠性面临哪些挑战?消费消息的确认机制是怎样的?本文通过分析消息流转的整个过程,从消息发送、消息存储和消息消费三个阶段介绍RocketMQ是如何保证消息的可靠性的。
RocketMQ如何保证消息的可靠性?
|
存储 NoSQL Redis
redis zset底层数据结构
zset底层存储结构  zset底层的存储结构包括ziplist或skiplist,在同时满足以下两个条件的时候使用ziplist,其他时候使用skiplist,两个条件如下: 有序集合保存的元素数量小于128个 有序集合保存的所有元素的长度小于64字节  当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素保存元素的分值。
15905 1