等不见天亮等时光

等不见天亮等时光
夜晚的堤岸,晃动着沉默的黑水。此岸草木枯竭,彼岸人烟繁盛。
  1. 首页
  2. 未分类
  3. 正文

基于redisson的分布式锁使用

2021年3月25日 23点热度 0人点赞 0条评论
  • 依赖
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>2.15.1</version>
</dependency>
  • 配置默认使用spring的
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=root
package com.sunyw.xyz.config;

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.redisson.config.TransportMode;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

/**
 * @description:
 * @author: sunyw
 * @version:1.0.0
 * @time: 2020-12-11 14:46
 */
@Configuration
public class RedissonConfig {

    @Value("${spring.redis.host}")
    String host;
    @Value("${spring.redis.port}")
    String port;
    @Value("${spring.redis.password}")
    String passwd;

    @Bean
    public RedissonClient initRedisson() {
        Config config = new Config ();
        SingleServerConfig singleServerConfig = config.useSingleServer ().setAddress ("redis://" + host + ":" + port);
        if (!StringUtils.isEmpty (passwd)) {
            singleServerConfig.setPassword (passwd);
        }
        //配置看门狗有效时间20s
        config.setLockWatchdogTimeout (2000);
        //配置保持发布订阅模式
        config.setKeepPubSubOrder (true);
        //传输模式为NIO
        config.setTransportMode (TransportMode.NIO);
        return Redisson.create (config);
    }
}
  • 公平锁
    
    package com.sunyw.xyz.controller;

import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
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.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**

  • @description:
  • @author: sunyw
  • @version:1.0.0
  • @time: 2020-12-11 14:45
    */
    @RestController
    @Slf4j
    public class RedissonController {

    @Autowired
    private RedissonClient redissonClient;

    private static final String LOCK_NAME = "lock";

    @GetMapping("/add/{id}")
    public String add(@PathVariable String id) {
    String name = Thread.currentThread ().getName ();
    RLock lock = redissonClient.getFairLock (LOCK_NAME);
    log.info ("线程[{}]进入add方法,开始进行取锁操作", name);
    try {
    lock.lock ();
    log.info ("线程[{}]获取到锁", name);
    Thread.sleep (3000);
    } catch (Exception e) {
    log.error ("错误信息", e);
    } finally {
    log.info ("线程[{}]释放锁", name);
    lock.unlock ();
    }
    return id;
    }
    }

- 非公平锁

`package com.sunyw.xyz.controller;

import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
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.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**

  • @description:
  • @author: sunyw
  • @version:1.0.0
  • @time: 2020-12-11 14:45
    */
    @RestController
    @Slf4j
    public class RedissonController {

    @Autowired
    private RedissonClient redissonClient;

    private static final String LOCK_NAME = "lock";

    @GetMapping("/add/{id}")
    public String add(@PathVariable String id) {
    String name = Thread.currentThread ().getName ();
    RLock lock = redissonClient.getLock (LOCK_NAME);
    log.info ("线程[{}]进入add方法,开始进行取锁操作", name);
    try {
    lock.lock ();
    log.info ("线程[{}]获取到锁", name);
    Thread.sleep (3000);
    } catch (Exception e) {
    log.error ("错误信息", e);
    } finally {
    log.info ("线程[{}]释放锁", name);
    lock.unlock ();
    }
    return id;
    }
    }

  • 尝试加锁,最多等待时间为100s,锁有效时间为10s
package com.sunyw.xyz.controller;

import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
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.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

/**
 * @description:
 * @author: sunyw
 * @version:1.0.0
 * @time: 2020-12-11 14:45
 */
@RestController
@Slf4j
public class RedissonController {

    @Autowired
    private RedissonClient redissonClient;

    private static final String LOCK_NAME = "lock";

    @GetMapping("/add/{id}")
    public String add(@PathVariable String id) {
        String name = Thread.currentThread ().getName ();
        RLock lock = redissonClient.getLock (LOCK_NAME);
        log.info ("线程[{}]进入add方法,开始进行取锁操作", name);
        try {
            boolean b = lock.tryLock (100, 10, TimeUnit.SECONDS);
            if (b){
                log.info ("线程[{}]获取到锁", name);
                Thread.sleep (3000);
            }
        } catch (Exception e) {
            log.error ("错误信息", e);
        } finally {
            log.info ("线程[{}]释放锁", name);
            lock.unlock ();
        }
        return id;
    }
}
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2021年3月25日

sunyw

这个人很懒,什么都没留下

点赞
下一篇 >

文章评论

取消回复
分类
最新 热点 随机
最新 热点 随机
ArrayBlockingQueue消息队列 SpringBoot整合ActiveMQ SpringBoot集成Dubbo示例 Linux环境下zookeeper的配置和安装以及dubbo-admin的安装和配置 springcloud初体验环境搭建 截取从指定位置开始字符串长度按照字节
分布式限流组件luajava自定义注解进行出参入参日志打印基于zookeeper+curator的分布式锁代码实现redis分布式锁基于springdataredis基于redisson的分布式锁使用Liunx环境下配置mysql数据库主从复制
ArrayBlockingQueue消息队列 SpringBoot整合ActiveMQ 基于redisson的分布式锁使用 基于zookeeper+curator的分布式锁代码实现 截取从指定位置开始字符串长度按照字节 Linux环境下zookeeper的配置和安装以及dubbo-admin的安装和配置
最近评论

COPYRIGHT © 2021 等不见天亮等时光. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

豫ICP备19043985号