redisson 分布式锁

1、依赖

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

2、实例

集群模式

/**
 * redis工具
 */
@Slf4j
@Component
public class RedissonConfig {
    /**
     * 集群节点,多个逗号分隔
     */
    @Value("${redis.cluster.nodes}")
    private String nodes;

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

    @Bean
    public RedissonClient redissonClient() {
        final int processors = Runtime.getRuntime().availableProcessors() * 2;
        Config config = new Config();
        config.setThreads(processors)
                .setNettyThreads(processors)
                .useClusterServers()
                .addNodeAddress(parseHostAndPort())
                .setPassword(password);

        return Redisson.create(config);
    }

    /**
     * 解析节点配置
     */
    private String[] parseHostAndPort() {
        try {
            List<String> nodeAddressList = new ArrayList<>();
            String[] nodesArray = nodes.split(",");
            for (String node : nodesArray) {
                String[] ipAndPort = node.split(":");
                nodeAddressList.add(String.format("redis://%s:%s", ipAndPort[0], ipAndPort[1]));
            }
            return nodeAddressList.toArray(new String[]{});
        } catch (Exception e) {
            log.error("parseHostAndPort:解析节点配置失败.error:", e);
        }
        return new String[]{};
    }
}

哨兵模式

/**
 * redis工具
 */
@Slf4j
@Component
public class RedissonConfig {
    /**
     * 哨兵模式主节点
     */
    @Value("${spring.redis.search.sentinel.master}")
    private String master;
    /**
     * 哨兵模式从节点,多个逗号分隔
     */
    @Value("${spring.redis.search.sentinel.nodes}")
    private String nodes;

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

    @Value("${spring.redis.search.masterConnectionPoolSize:200}")
    private Integer masterConnectionPoolSize;

    @Value("${spring.redis.search.slaveConnectionPoolSize:200}")
    private Integer slaveConnectionPoolSize;

    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        SentinelServersConfig sentinelServersConfig = config.useSentinelServers()
                .addSentinelAddress(parseHostAndPort())
                .setMasterName(master)
                .setMasterConnectionPoolSize(masterConnectionPoolSize)
                .setSlaveConnectionPoolSize(slaveConnectionPoolSize);
        sentinelServersConfig.setPassword(password);
        return Redisson.create(config);
    }

    /**
     * 解析节点配置
     */
    private String[] parseHostAndPort() {
        try {
            List<String> nodeAddressList = new ArrayList<>();
            String[] nodesArray = nodes.split(",");
            for (String node : nodesArray) {
                String[] ipAndPort = node.split(":");
                nodeAddressList.add(String.format("redis://%s:%s", ipAndPort[0], ipAndPort[1]));
            }
            return nodeAddressList.toArray(new String[]{});
        } catch (Exception e) {
            log.error("parseHostAndPort:解析节点配置失败.error:", e);
        }
        return new String[]{};
    }
}

3、使用

public class RedissonLockTest {
    @Resource
    private RedissonClient redissonClient;

    public void test(){
        RLock rLock = redissonClient.getLock("test");
        rLock.lock(10, TimeUnit.SECONDS);
        try {
            // do sth

        } finally {
            try {
				rLock.unlock();
			} catch (Exception e) {
				log.warn("rLock.unlock() fail.taskKey = {}.error:{}", taskKey,e);
			}
        }
    }

}

4、注意事项

排除netty包冲突。

假设项目中依赖了阿里云rocketmq的包,则需排除掉该包中的netty(此包中的netty版本低于redisson 3.11.0中依赖的netty版本)

<dependency>
    <groupId>com.aliyun.openservices</groupId>
    <artifactId>ons-client</artifactId>
    <version>1.8.4.Final</version>
    <exclusions>
        <exclusion>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
        </exclusion>
    </exclusions>
</dependency>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值