Redisson是一个用于Java的分布式和高可用的Java对象的框架,它基于Redis实现。在Spring Boot应用程序中集成Redisson可以帮助我们更轻松地实现分布式锁、分布式对象、分布式集合等功能。本文将介绍如何在Spring Boot项目中集成Redisson,并展示一些基本用法。

添加依赖

在Spring Boot项目中,打开pom.xml文件并添加以下Redisson的Maven依赖:

org.redisson

redisson

3.25.2

添加配置文件

在application.yml文件中添加Redisson的配置信息:

spring:

redisson:

# 单机模式

host: 192.168.10.106

port: 6379

# 哨兵模式

sentinel:

master: mymaster

nodes: 192.168.10.106:6209,192.168.10.106:6219,192.168.10.106:6229

# 集群模式

cluster: 192.168.10.106:6109,192.168.10.106:6119,192.168.10.106:6129

# 密码

password: xj2022

注意: 我们如果只有一个redis客户端的话我们在此处只需要配置一种模式,别的配置信息留空即可,我们会通过配置类优先找 哨兵配置,没有的话再找cluster集群配置,没有的话再找单机配置。

添加配置类

在代码中添加配置类RedissonConfig:

import lombok.extern.slf4j.Slf4j;

import org.apache.commons.lang3.StringUtils;

import org.redisson.Redisson;

import org.redisson.api.RedissonClient;

import org.redisson.client.codec.StringCodec;

import org.redisson.config.Config;

import org.redisson.config.ReadMode;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

@Slf4j

public class RedissonConfig {

@Value("${spring.redisson.sentinel.nodes}")

private String sentinel;

@Value("${spring.redisson.sentinel.master}")

private String masterName;

@Value("${spring.redisson.cluster}")

private String cluster;

@Value("${spring.redisson.host}")

private String host;

@Value("${spring.redisson.port}")

private String port;

@Value("${spring.redisson.password}")

private String password;

private int timeout = 2000;

private int scanInterval = 60000;

private static String ADDRESS_PREFIX = "redis://";

/**

* 单机模式

*/

@Bean

public RedissonClient initBean() {

// 哨兵模式

if (StringUtils.isNotBlank(sentinel)) {

log.info("redis is sentinel mode");

return redissonSentinel();

}

// 集群模式

if (StringUtils.isNotBlank(cluster)) {

log.info("redis is cluster mode");

return redissonCluster();

}

// 单机模式

if (StringUtils.isNotBlank(host)) {

log.info("redis is single mode");

return redissonSingle();

}

log.error("redisson config can not support this redis mode");

return null;

}

/**

* 单机模式

*/

private RedissonClient redissonSingle() {

Config config = new Config();

String address = ADDRESS_PREFIX+host+":"+port;

//设置

config.setCodec(new StringCodec())

//这是用的集群server

.useSingleServer()

.setAddress(address)

.setTimeout(timeout)

.setPassword(password);

return Redisson.create(config);

}

/**

* 哨兵模式

*/

private RedissonClient redissonSentinel() {

String[] nodes = sentinel.split(",");

//redisson版本是3.5,集群的ip前面要加上“redis://”,不然会报错,3.2版本可不加

for(int i=0;i

nodes[i] = ADDRESS_PREFIX+nodes[i];

}

Config config = new Config();

//设置

config.setCodec(new StringCodec())

.useSentinelServers()

.setMasterName(masterName)

.setPassword(password)

.setTimeout(timeout)

.addSentinelAddress(nodes)

// 在Redisson启动期间启用sentinels列表检查,默认为true,这里我们设置为false,不检查

.setCheckSentinelsList(false);

return Redisson.create(config);

}

/**

* 集群模式

*/

private RedissonClient redissonCluster() {

String[] nodes = cluster.split(",");

//redisson版本是3.5,集群的ip前面要加上“redis://”,不然会报错,3.2版本可不加

for(int i=0;i

nodes[i] = ADDRESS_PREFIX+nodes[i];

}

Config config = new Config();

//设置

config.setCodec(new StringCodec())

//这是用的集群server

.useClusterServers()

//设置集群状态扫描时间

.setScanInterval(scanInterval)

.addNodeAddress(nodes)

.setPassword(password)

.setReadMode(ReadMode.MASTER);;

return Redisson.create(config);

}

}

这样,我们就配置好了redisson,我们可以在代码中使用了。

示例:分布式锁

以下是一个使用redisson 分布式锁的示例代码

import jakarta.annotation.Resource;

import lombok.extern.slf4j.Slf4j;

import org.redisson.api.RLock;

import org.redisson.api.RedissonClient;

import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service

@Slf4j

public class RedissonTestService {

@Resource

private RedissonClient redissonClient;

//锁过期时间

private static final Long LOCK_KEY_TIME = 120L;

public void doJobTask() {

//定时任务执行周期较短,为防止数据重复修改,加入锁

RLock lock = redissonClient.getLock("your_task_name");

// 尝试获取锁并设定锁的过期时间

boolean acquired = false;

try {

//获取锁

acquired = lock.tryLock(0, LOCK_KEY_TIME, TimeUnit.SECONDS);

} catch (InterruptedException e) {

log.error("取锁失败");

}

if (acquired) {

try {

// 执行业务逻辑

}catch (Exception e) {

log.error("处理失败");

//业务异常处理逻辑

}finally {

// 释放锁

lock.unlock();

}

} else {

// 获取锁失败,说明有其他线程或进程正在处理数据

// 可以进行重试或触发告警机制

}

}

}

这只是一个简单的示例,你可以根据需要使用更高级的Redisson功能。

总结

通过集成Redisson,我们可以轻松地实现分布式系统中的各种功能,提高应用程序的可伸缩性和可靠性。我们在生产环境会经常有跨机房使用承载网连接redis的情况,我们后续会在写一篇关于redisson实现承载网转换源码改造的文章。希望本文能够帮助你快速入门Spring Boot集成Redisson,并在实际项目中应用这些功能。

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: