0
点赞
收藏
分享

微信扫一扫

Redisson分布式锁的简单使用

添加redisson pom依赖

<!-- Redisson -->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.17.6</version>
        </dependency>

在yml配置文件里填写redis相关信息

spring
  redis:
    # 地址
    host: localhost
    # 端口,默认为6379
    port: 6379
    # 数据库索引
    database: 1
    # 密码
    password:
    # 连接超时时间
    timeout: 2000
    lettuce:
      pool:
        # 连接池中的最小空闲连接
        min-idle: 0
        # 连接池中的最大空闲连接
        max-idle: 8
        # 连接池的最大数据库连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms

添加配置类

package com.ruoyi.framework.config;

import com.ruoyi.common.utils.CheckUtils;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Redisson配置类
 *
 * @author DaenMax
 */
@Configuration
public class RedissonConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private String port;

    @Value("${spring.redis.password}")
    private String redisPassword;

    @Bean
    public RedissonClient getRedisson() {
        Config config = new Config();
        SingleServerConfig singleServerConfig = config.useSingleServer();
        singleServerConfig.setAddress("redis://" + host + ":" + port);
        if (CheckUtils.isNotEmpty(redisPassword)) {
            singleServerConfig.setPassword(redisPassword);
        }
        return Redisson.create(config);
    }
}

使用demo

@Override
    public AjaxResult test() {
        RLock lock = redissonClient.getLock(RcmSysConstants.LOCK_TRANS);
        System.out.println("等待获取锁中...");
        lock.lock(30L, TimeUnit.SECONDS);//这行代码会阻塞,直到其他线程 RcmSysConstants.LOCK_TRANS 这个值的锁被释放
        //lock()方法的参数有超时时间,即锁的有效期,不填的话默认-1,永久有效
        try {
            System.out.println("已经获取到锁,执行业务代码中");
            //这里写你的业务代码...省略
            //模拟延迟一下
            MyUtils.sleep(3000);
            return AjaxResult.success("登录成功");
        } catch (Exception e) {
            System.out.println("发生异常" + e.getMessage());
        } finally {
            if (lock.isLocked()) {
                lock.unlock();
                System.out.println("业务代码执行完毕,已解锁");
            }
        }
        return AjaxResult.error("登录失败");
    }

测试

因为我这个是controller调用的这个方法,所以我就在用接口测试工具并发5次看看吧

等待获取锁中...
等待获取锁中...
等待获取锁中...
已经获取到锁,执行业务代码中
等待获取锁中...
等待获取锁中...
业务代码执行完毕,已解锁
已经获取到锁,执行业务代码中
业务代码执行完毕,已解锁
已经获取到锁,执行业务代码中
业务代码执行完毕,已解锁
已经获取到锁,执行业务代码中
业务代码执行完毕,已解锁
已经获取到锁,执行业务代码中
业务代码执行完毕,已解锁

举报

相关推荐

0 条评论