首页 > 数据库 >分布式锁解决方案——redisson的使用

分布式锁解决方案——redisson的使用

时间:2022-09-07 12:45:12浏览次数:70  
标签:redisson lock void park 解决方案 org public 分布式

概述

redisson:

​ 提供基于redis的分布式服务,包含很多,本文详细介绍 springboot 下的分布式锁的使用

​ 学过JUC的话,可以无缝的转换到redisson,因为redisson实现了Lock接口,并且功能很强大

配置

配置好redis 后再进行以下操作

依赖

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.17.6</version>
</dependency>

配置类:单节点模式

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyRedissonConfig {

    @Bean(destroyMethod = "shutdown")
    public RedissonClient redisson() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://localhost:6379");
        RedissonClient redissonClient = Redisson.create(config);
        return redissonClient;
    }
}

测试

使用

Lock 锁(可重入锁)

    void lockTest() {
        // 获取一把锁:只要名字一样,就是同一把锁
        RLock lock = redisson.getLock("yh-lock");

        // 加锁
        /**
         * 默认加锁30s,如果业务没做完,会自动续期
         * 但如果指定时间,就不会自动续期
         */
        lock.lock(30, TimeUnit.SECONDS); // 最佳实践
        try {
            System.out.println("加锁成功,实现业务...");
        } finally {
            // 解锁: 无论如何都要解锁
            /**
             * 即使停机导致解锁代码没有运行,redisson也不会出现死锁、
             *
             */
            System.out.println("释放锁");
            lock.unlock();
        }
    }

公平锁

    public void fairLockTest() {
        RLock fairLock = redisson.getFairLock("f-lock");
        fairLock.lock();
        fairLock.unlock();
    }

读写锁

写锁

    public void wLockTest() {
        // 获取读写锁
        RReadWriteLock lock = redisson.getReadWriteLock("rw-lock");

        // 写锁
        RLock rLock = lock.writeLock();
        rLock.unlock();  // 释放写锁
    }

读锁

    public void rLockTest() {
        // 读取读写锁
        RReadWriteLock lock = redisson.getReadWriteLock("rw-lock");

        // 读锁
        RLock rLock = lock.readLock();
        rLock.unlock();
    }

闭锁

    @Test
    public void doorLockTest() throws InterruptedException {
        // 获取闭锁
        RCountDownLatch lock = redisson.getCountDownLatch("cd-lock");

        lock.trySetCount(5); // 设置计数,若计数清零闭锁自动关闭
        lock.await(); // 等待计数清零

        System.out.println("闭锁关闭后的业务逻辑...");
    }
    
    @Test
    public void goTest() {
        RCountDownLatch lock = redisson.getCountDownLatch("cd-lock");
        lock.countDown(); // 计数减一
    }

信号量测试

    public void park() throws InterruptedException {
        redisTemplate.opsForValue().set("park", "5"); // redis里设置5个车位
        RSemaphore park = redisson.getSemaphore("park");

//        park.acquire(); // 占一个车位
        boolean flag = park.tryAcquire();// 尝试占一个车位,有车位就true
        if (flag) {

        } else {

        }
    }
    public void parkGoTest() {
        RSemaphore park = redisson.getSemaphore("park");
        park.release(); // 释放一个车位,计数减一
    }

标签:redisson,lock,void,park,解决方案,org,public,分布式
From: https://www.cnblogs.com/acdongla/p/16664993.html

相关文章

  • (转)基于.NET Standard的分布式自增ID算法--Snowflake
    转自:https://www.lmlphp.com/user/1222/article/item/15683/概述本篇文章主要讲述分布式ID生成算法中最出名的Snowflake算法。搞.NET开发的,数据库主键最常见的就是int类......
  • 云图说丨初识分布式消息服务Kafka版
    摘要:分布式消息服务Kafka版是一款基于开源社区版Kafka提供的消息队列服务,向用户提供计算、存储和带宽资源独占式的Kafka实例。本文分享自华为云社区《【云图说】第254期......
  • ElasticSearch让的分布式系统架构设计
    注:本文摘自:https://mp.weixin.qq.com/s/dOTF9BVdySiwtkUrNg-gEA分布式系统类型多,涉及面非常广,不同类型的系统有不同的特点,批量计算和实时计算就差别非常大。这篇文章中,重......
  • jmeter响应信息中文乱码-解决方案
     1:线程组-添加-后置处理器-BeanshellPostProcessor2:添加内容:prev.setDataEncoding("utf-8")    ......
  • 分布式中灰度方案实践
    让请求在导航的服务节点上执行;一、背景介绍在分布式系统中会有这样的开发场景。不同的需求可能会涉及到同一个服务的开发,所以在开发期间会有多个版本的服务并行。为了......
  • 数智加油站 | 智慧加油站数字孪生三维可视化监控管理系统解决方案
    智慧加油站建设背景当前,在全球能源体系中,化石能源依然占据主导地位。以石油为例,其作为“工业的血液”,贯穿我们的整个生活,大到国家的工业、农业、交通、国防,小到每个人的衣......
  • 分布式中灰度方案实践
    让请求在导航的服务节上点执行;一、背景简介分布式系统中会存在这样的开发场景,不同需求可能涉及到对同一个服务的开发,那么该服务在研发期间就会存在多个版本并行的状态,......
  • DB\redis\zookeeper分布式锁设计
    多线程情况下对共享资源的操作需要加锁,避免数据被写乱,在分布式系统中,这个问题也是存在的,此时就需要一个分布式锁服务。常见的分布式锁实现一般是基于DB、Redis、zookeeper......
  • RocketMq使用过程中问题场景和解决方案
    MQ使用过程中可能出现的问题以及解决方案一、MQ如何避免消息堆积的问题:1)产生背景:producer发送消息的速率远大于consumer消费消息的速率,从而导致消息堆积在mq服务端中;2)......
  • jsp大文件上传解决方案支持分片断点上传
    ​前言:因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传,而自己对java文件上传这一块未接触过,且对Http协议较模糊,故这次采用渐进的方式来学习文件上传的原......