码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【实践篇】Redis最强Java客户端(三)之Redisson 7种分布式锁使用指南


    文章目录

    • 0. 前言
    • 1. Redisson 7种分布式锁使用指南
      • 1.1 简单锁:
      • 1.2 公平锁:
      • 1.3 可重入锁:
      • 1.4 红锁:
      • 1.5 读写锁:
      • 1.6 信号量:
      • 1.7 闭锁:
    • 2. Spring boot 集成Redisson 验证分布式锁
    • 3. 参考资料
    • 4. 源码地址
    • 5. Redis从入门到精通系列文章

    在这里插入图片描述

    0. 前言

    前两章我们了解了《【实践篇】Redis最强Java客户端(一)之Redisson入门介绍》和《【实践篇】Redis最强Java客户端(二)之Redisson基础概念》本章第三章主要介绍Redisson的七种分布式锁,分别是简单锁、公平锁、可重入锁、红锁、读写锁、信号量和闭锁。下面是每种锁的基本概念、使用方法以及性能和并发控制方面的考虑。
    在这里插入图片描述

    1. Redisson 7种分布式锁使用指南

    1.1 简单锁:

    • 简单锁是最基本的分布式锁,通过调用Redisson的getLock()方法来获取锁,并使用lock()和unlock()方法来加锁和解锁。
    • 简单锁在性能方面表现良好,可以提供良好的并发控制。
    RLock lock = redisson.getLock("myLock");
    lock.lock();
    try {
        // 执行需要加锁的业务逻辑
    } finally {
        lock.unlock();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.2 公平锁:

    • 公平锁是按照请求锁的顺序来获取锁的,先到先得。通过调用Redisson的getFairLock()方法来获取公平锁。
    • 性能和公平性控制:公平锁在性能方面相对较低,因为需要维护一个请求锁的队列来保证公平性。
    RLock fairLock = redisson.getFairLock("myFairLock");
    fairLock.lock();
    try {
        // 执行需要加锁的业务逻辑
    } finally {
        fairLock.unlock();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.3 可重入锁:

    • 可重入锁是可以被同一个线程多次获取的锁。通过调用Redisson的getReentrantLock()方法来获取可重入锁。
    • 性能和重入控制:可重入锁在性能方面表现良好,并且可以通过计数器来控制锁的重入次数。
    RReentrantLock reentrantLock = redisson.getReentrantLock("myReentrantLock");
    reentrantLock.lock();
    try {
        // 执行需要加锁的业务逻辑
    } finally {
        reentrantLock.unlock();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.4 红锁:

    • 红锁是在多个Redis实例上获取锁的一种机制,要求大多数Redis实例成功获取锁才算成功。通过调用Redisson的getRedLock()方法来获取红锁。
    • 性能和分布式锁控制:红锁在性能方面相对较低,因为需要在多个Redis实例之间进行同步。
    RLock lock1 = redisson.getLock("lock1");
    RLock lock2 = redisson.getLock("lock2");
    RLock lock3 = redisson.getLock("lock3");
    RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);
    redLock.lock();
    try {
        // 执行需要加锁的业务逻辑
    } finally {
        redLock.unlock();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    1.5 读写锁:

    • 读写锁是同时支持读操作和写操作的锁。通过调用Redisson的getReadWriteLock()方法来获取读写锁。
    • 读写锁在读操作方面允许并发访问,但在写操作方面只允许一个线程访问。
    RReadWriteLock readWriteLock = redisson.getReadWriteLock("myReadWriteLock");
    RLock readLock = readWriteLock.readLock();
    RLock writeLock = readWriteLock.writeLock();
    readLock.lock();
    try {
        // 执行需要读取的业务逻辑
    } finally {
        readLock.unlock();
    }
    
    writeLock.lock();
    try {
        // 执行需要写入的业务逻辑
    } finally {
        writeLock.unlock();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    1.6 信号量:

    • 信号量是一种用于控制并发访问数量的锁。通过调用Redisson的getSemaphore()方法来获取信号量。
    • 信号量可以控制同时访问的线程数量,从而控制并发访问。
    RSemaphore semaphore = redisson.getSemaphore("mySemaphore");
    semaphore.acquire();
    try {
        // 执行需要并发控制的业务逻辑
    } finally {
        semaphore.release();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.7 闭锁:

    • 闭锁是一种用于等待其他线程完成任务的同步工具。通过调用Redisson的getCountDownLatch()方法来获取闭锁。
    • 闭锁可以等待其他线程完成任务后再继续执行。
    RCountDownLatch latch = redisson.getCountDownLatch("myLatch");
    latch.trySetCount(1);
    
    // 等待其他线程完成任务
    latch.await();
    
    // 执行需要等待的业务逻辑
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    以上是Redisson的七种分布式锁的基本概念、使用方法以及性能和并发控制方面的考虑。这些分布式锁可以在分布式环境中提供可靠的并发控制和资源访问解决方案。

    2. Spring boot 集成Redisson 验证分布式锁

    1. 添加Redisson依赖
    <dependency>
        <groupId>org.redissongroupId>
        <artifactId>redisson-spring-boot-starterartifactId>
        <version>3.15.5version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 配置Redisson连接
    # Redisson连接信息
    spring.redis.host=127.0.0.1
    spring.redis.port=6379
    # 其他Redisson配置(可选)
    spring.redisson.config=classpath:redisson.yaml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 创建Redisson配置文件(可选)
    singleServerConfig:
      address: "redis://127.0.0.1:6379"
    
    • 1
    • 2
    1. 使用Redisson
    package com.example.redissondemo.controller;
    
    import org.redisson.api.RLock;
    import org.redisson.api.RReadWriteLock;
    import org.redisson.api.RedissonClient;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class LockController {
    
        @Autowired
        RedissonClient redissonClient;
    
        @GetMapping("/lock")
        public void testLock() throws InterruptedException {
    
            // 1. 可重入锁(Reentrant Lock)
            RLock reentrantLock = redissonClient.getLock("reentrantLock");
            reentrantLock.lock();
            try {
                // critical section / business logic
            } finally {
                reentrantLock.unlock();
            }
    
            // 2. 公平锁(Fair Lock)
            RLock fairLock = redissonClient.getFairLock("fairLock");
            fairLock.lock();
            try {
                // critical section / business logic
            } finally {
                fairLock.unlock();
            }
    
            // 3. 读写锁(Read-Write Lock)
            RReadWriteLock rwLock = redissonClient.getReadWriteLock("rwLock");
            
            // 写锁
            rwLock.writeLock().lock();
            try {
                // write data
            } finally {
                rwLock.writeLock().unlock();
            }
            
            // 读锁
            rwLock.readLock().lock();
            try {
                // read data
            } finally {
                rwLock.readLock().unlock();
            }
    
            // 4. 联锁(MultiLock)
            RLock lock1 = redissonClient.getLock("lock1");
            RLock lock2 = redissonClient.getLock("lock2");
            RLock lock3 = redissonClient.getLock("lock3");
            RLock multiLock = redissonClient.getMultiLock(lock1, lock2, lock3);
            multiLock.lock();
            try {
                // combined business operations on lock1, lock2 and lock3
            } finally {
                multiLock.unlock();
            }
    
            // 5. 红锁(RedLock)
            RLock redLock = redissonClient.getRedLock(lock1, lock2, lock3);
            redLock.lock();
            try {
                // combined business operations on lock1, lock2 and lock3
            } finally {
                redLock.unlock();
            }
    
            // 6. 自动过期锁(Auto-expiring Lock)
            RLock autoExpireLock = redissonClient.getLock("autoExpireLock");
            autoExpireLock.lock();
            try {
                // critical section / business logic
            } finally {
                autoExpireLock.forceUnlock();
            }
    
            // 7. 闭锁(CountDownLatch Lock)
            RCountDownLatch latch = redissonClient.getCountDownLatch("latchLock");
            latch.trySetCount(1);
            latch.await();
            
            // to release the latch
            latch.countDown();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95

    如果想自定义配置可以这样写,不依赖于Spring boot 注入bean 手动构造一个client 提交给Spring 容器

    @java
    public class RedissonConfig {
    
        @Value("${redisson.address}")
        private String addressUrl;
    
        @Value("${redisson.password}")
        private String password;
    
        @Bean
        public RedissonClient getRedisson(){
            Config config = new Config();
            config.useSingleServer().setAddress(addressUrl).setPassword(password);
            return Redisson.create(config);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3. 参考资料

    1. Redisson官方网站:https://redisson.org/

    2. Redisson GitHub仓库:https://github.com/redisson/redisson

    3. redisson 参考文档 https://redisson.org/documentation.html

    4. 源码地址

    https://github.com/wangshuai67/icepip-springboot-action-examples
    https://github.com/wangshuai67/Redis-Tutorial-2023

    5. Redis从入门到精通系列文章

    • 《【Redis实践篇】使用Redisson 优雅实现项目实践过程中的5种场景》
    • 《Redis使用Lua脚本和Redisson来保证库存扣减中的原子性和一致性》
    • 《SpringBoot Redis 使用Lettuce和Jedis配置哨兵模式》
    • 《Redis【应用篇】之RedisTemplate基本操作》
    • 《Redis 从入门到精通【实践篇】之SpringBoot配置Redis多数据源》
    • 《Redis 从入门到精通【进阶篇】之三分钟了解Redis HyperLogLog 数据结构》
    • 《Redis 从入门到精通【进阶篇】之三分钟了解Redis地理位置数据结构GeoHash》
    • 《Redis 从入门到精通【进阶篇】之高可用哨兵机制(Redis Sentinel)详解》
    • 《Redis 从入门到精通【进阶篇】之redis主从复制详解》
    • 《Redis 从入门到精通【进阶篇】之Redis事务详解》
    • 《Redis从入门到精通【进阶篇】之对象机制详解》
    • 《Redis从入门到精通【进阶篇】之消息传递发布订阅模式详解》
    • 《Redis从入门到精通【进阶篇】之持久化 AOF详解》
    • 《Redis从入门到精通【进阶篇】之持久化RDB详解》
    • 《Redis从入门到精通【高阶篇】之底层数据结构字典(Dictionary)详解》
    • 《Redis从入门到精通【高阶篇】之底层数据结构快表QuickList详解》
    • 《Redis从入门到精通【高阶篇】之底层数据结构简单动态字符串(SDS)详解》
    • 《Redis从入门到精通【高阶篇】之底层数据结构压缩列表(ZipList)详解》
    • 《Redis从入门到精通【进阶篇】之数据类型Stream详解和使用示例》
      在这里插入图片描述大家好,我是冰点,今天的【实践篇】Redis最强Java客户端(三)之Redisson 7种分布式锁使用指南,全部内容就是这些。如果你有疑问或见解可以在评论区留言。
  • 相关阅读:
    从0开始python学习-28.selenium 需要图片验证的登录
    java计算机毕业设计疫情物质管理系统源程序+mysql+系统+lw文档+远程调试
    react路由基础理解
    【web-渗透测试方法】(15.7)测试功能方面的输入漏洞
    Kotlin挂起函数基础
    RabbitMQ------简单队列模式以及工作队列模式以及消息应答的方式(三)
    Simulink建模:LKA系统功能状态机建模
    Dlib+Opencv库实现疲劳检测
    MySQL数据库管理基本操作(一)
    AVR单片机开发3——定时器T0 查询方式
  • 原文地址:https://blog.csdn.net/wangshuai6707/article/details/132791507
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号