Redssion分布式锁集成使用


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

一、依赖引入


<dependency>
    <groupId>org.redissongroupId>
    <artifactId>redisson-spring-boot-starterartifactId>
    <version>3.16.4version>
dependency>

       这里很多博友给出的集成方式不通,有的说要引入redisson或redisson-all或redisson-spring-data-x等,这些应该都没有错,错的是时期不同,现在这些通通不需要了。可以点redisson-spring-boot-starter进去看它的pom,里面相关的依赖都是已经引入了的。
Redssion分布式锁集成使用_第1张图片
       这里再多嘴说一句,redis的客户端、相关starter等还是要自己引入的,因为redisson里是排除了的。同样在redisson的依赖pom可以看到:
Redssion分布式锁集成使用_第2张图片

二、配置类


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;

/**
 * Redisson分布式锁集成
 *
 * @author zhengwen
 **/
@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;

/**
 * Redisson分布式锁测试类
 *
 * @author zhengwen
 **/
@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);
                }
            }
        }
    }
}

四、测试类执行效果

Redssion分布式锁集成使用_第3张图片
       如果第3次不sleep,第4次应该跟第二次效果一样,对吧。结合测试类,好好理解下第3次、第4次。

五、总结

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

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

你可能感兴趣的:(工具,分布式锁,架构,Redisson集成,Redisson分布式锁,Redis分布式锁实现)