栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Redssion分布式锁集成使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Redssion分布式锁集成使用


       计划提前了点,趁空看看这个传说中很牛逼的Redisson分布式锁,集成着玩,后面看场景试试使用。废话后面总结说,这里先上货。

一、依赖引入

    org.redisson
    redisson-spring-boot-starter
    3.16.4

       这里很多博友给出的集成方式不通,有的说要引入redisson或redisson-all或redisson-spring-data-x等,这些应该都没有错,错的是时期不同,现在这些通通不需要了。可以点redisson-spring-boot-starter进去看它的pom,里面相关的依赖都是已经引入了的。

       这里再多嘴说一句,redis的客户端、相关starter等还是要自己引入的,因为redisson里是排除了的。同样在redisson的依赖pom可以看到:

二、配置类
import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
@Slf4j
public class MyRedissonConfig {

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

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

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

    @Bean(destroyMethod = "shutdown")
    RedissonClient redissonClient() {
        String address = "redis://" + hostName + ":" + port;
        Config config = new Config();
        //注意useSingleServer,这里还有其他的,哨兵、集群、还有Sentinel等,大家根据自己的redis服务实际情况设置
        config.useSingleServer().setAddress(address);
        //我本机密码为空,不设置
        //config.useSingleServer().setAddress(address).setPassword(password);
        return Redisson.create(config);
    }
}

       这个也可以单独搞一个redisson的配置文件,配置类其实看官网更直接,也最贴合当前时期的最新版本。
       这里配置项,我就设置了几个最基本的,需要更详细的可以看官方api。

三、使用

       这里用一个junit测试类演示取锁、解锁的过程,后面在业务使用过程中其实只需要结合业务场景,设置好锁key值,选用不同的锁就行了。

import com.easylinkin.bm.BmApp;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.concurrent.TimeUnit;


@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ApplicationArguments.class, BmApp.class})
public class RedissonTest {

    @Autowired
    private RedissonClient redissonClient;

    @Test
    public void testRedissonLock() throws Exception {
        log.info("--redisson分布式锁测试--");
        for (int i = 1; i < 6; i++) {
            log.info("-------第{}次--------", i);

            RLock lock = redissonClient.getLock("zwces1");
            try {
                if (lock != null) {
                    log.info("---拿到的lock:{}", lock.getName());
                }
                if (lock.isLocked()) {
                    log.info("---已被锁锁了");
                } else {
                    lock.lock(1000 * 60, TimeUnit.MILLISECONDS);
                    log.info("--取到了,锁1分钟");
                }
            } catch (Exception e) {
                log.error("----测试redisson锁发生异常,原因:{}", e.getMessage(), e);
            } finally {
                //3的倍数解锁
                if (i % 2 == 0) {
                    if (lock.isHeldByCurrentThread()) {
                        lock.unlock();
                        log.info("---解锁成功");
                    }
                }
                if (i % 3 == 0) {
                    log.info("睡眠锁锁定的时长");
                    Thread.sleep(1000 * 60);
                }
            }
        }
    }
}
四、测试类执行效果


       如果第3次不sleep,第4次应该跟第二次效果一样,对吧。结合测试类,好好理解下第3次、第4次。

五、总结
  1. 集成如果想要最新版本,网上的都只能是参考,尤其是这种发展中的组件
  2. 现在不需要自己封装一些锁的接口了,RedissonClient里都有,应该是够用的,如果不是特别理解原理不要瞎封装,否在害人害己
  3. 之前有同事用,遇到过锁不住的问题。我们不是同一个组,我看不到代码跟集成的版本,也不好说原因。(好像他们是自己封装了一些锁的接口,另外个人觉得这种这么火的组件应该不至于出这种问题,不然还火个鬼)

       最后,还是跟大家说下,多看官网。所有博友写的都是参考,包括我(尽管我现在集成的是最新版),但是这么火的组件,保不准后面有版本升级的变动,不过我这里的集成是最基本的,而且spring提供了官方starter应该不会有的变动了。希望能帮到大家,加油技术人。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/458608.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号