使用Redisson實現分佈式鎖(高清)

1、maven座標

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

2、配置(一種是單節點,另外一種是哨兵)

redisson.single-is=true
redisson.single-address=127.0.0.1:6379
redisson.single-password=123456
redisson.sentinel-is=false
redisson.sentinel-master-name=business-master
redisson.sentinel-addresses=127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381
redisson.sentinel-password=123456

3、redis配置類

package com.lee.mybatis.plus.utils;

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.apache.commons.lang3.StringUtils;
import org.redisson.config.SentinelServersConfig;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RedissonConfig {
    @Value("${redisson.single-address}")
    private String singleAddress;

    @Value("${redisson.single-password}")
    private String singlePassword;

    @Value("${redisson.sentinel-master-name}")
    private String sentinelMasterName;

    @Value("${redisson.sentinel-addresses}")
    private String sentinelAddresses;

    @Value("${redisson.sentinel-password}")
    private String sentinelPassword;

    /**
     * 單機模式自動裝配
     * @return
     */
    @Bean
    @ConditionalOnProperty(name="redisson.single-is",havingValue="true")
    public RedissonClient getSingleRedisson(){
        Config config = new Config();
        SingleServerConfig serverConfig = config.useSingleServer().setAddress("redis://" + singleAddress);
        if(StringUtils.isNotBlank(singlePassword)){
            serverConfig.setPassword(singlePassword);
        }
        return Redisson.create(config);
    }

    /**
     * 哨兵模式自動裝配
     * @return
     */
    @Bean
    @ConditionalOnProperty(name="redisson.sentinel-is",havingValue="true")
    public RedissonClient getSentinelRedisson(){
        Config config = new Config();
        SentinelServersConfig serverConfig = config.useSentinelServers().addSentinelAddress(sentinelAddresses).setMasterName(sentinelMasterName);
        if(StringUtils.isNotBlank(sentinelPassword)) {
            serverConfig.setPassword(sentinelPassword);
        }
        return Redisson.create(config);
    }
}

4、使用

  @Autowired
  private RedissonClient redissonClient;

  @GetMapping("/subNum")
    public Map<String, String> subNum(String lockName) {
        HashMap<String, String> map = new HashMap<>();
        //獲取鎖
        RLock rlock = redissonClient.getLock(lockName);
        try {
            //等待5秒,鎖過期時間6秒,單位:秒
            boolean isLock = rlock.tryLock(5, 6, TimeUnit.SECONDS);
            if (isLock) {
                //業務邏輯
            }

        } catch (Exception e) {
             //skip
        }finally {
            //釋放鎖
            rlock.unlock();
        }
      
        return map;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章