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


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
5天前
|
安全 Java 测试技术
ReentrantReadWriteLock(可重入读写锁)源码解读与使用
ReentrantReadWriteLock(可重入读写锁)源码解读与使用
|
5天前
|
存储 NoSQL Java
Redisson实现分布式锁
Redisson实现分布式锁
34 0
|
6月前
|
缓存 NoSQL Redis
redisson实现分布式锁
redisson实现分布式锁
37 1
|
9月前
|
存储 运维 NoSQL
Redisson可重入锁原理
Redisson提供的分布式锁是可重入的,它使用的是Hset命令和Hash数据结构。
Redisson可重入锁原理
|
10月前
|
NoSQL Java 测试技术
redisson中的分布式锁解读(下)
redisson中的分布式锁解读(下)
|
10月前
|
监控 NoSQL 算法
redisson中的分布式锁解读(上)
redisson中的分布式锁解读
Redisson 分布式锁的正确使用
你会正确使用分布式锁吗?
1798 0
Redisson 分布式锁的正确使用
|
监控 NoSQL Java
Redisson 完成分布式锁
Redisson 完成分布式锁
Redisson 完成分布式锁
|
缓存 SpringCloudAlibaba 前端开发
JUC系列(九) CAS 与锁的理解
CAS 解决ABA问题 对于juc下的几个做类型的理解
JUC系列(九)  CAS 与锁的理解
|
NoSQL 算法 Java
Redisson 分布式锁源码 01:可重入锁加锁
相信小伙伴都是使用分布式服务,那一定绕不开分布式服务中数据并发更新问题! 单系统很容易想到 Java 的各种锁,像 synchronize、ReentrantLock 等等等,那分布式系统如何处理?
231 0