一、依赖配置
1.1 maven 依赖
在 pom.xml 中添加以下依赖:
<!-- spring integration redis -->
<dependency>
<groupid>org.springframework.integration</groupid>
<artifactid>spring-integration-redis</artifactid>
<version>5.5.18</version> <!-- 版本需与 spring 框架兼容 -->
</dependency>
<!-- spring data redis -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-data-redis</artifactid>
</dependency>1.2 gradle 依赖
在 build.gradle 中添加:
implementation 'org.springframework.integration:spring-integration-redis:5.5.18' implementation 'org.springframework.boot:spring-boot-starter-data-redis'
二、redis 连接配置
2.1 配置 redis 连接工厂
在 application.properties 或 application.yml 中配置 redis 连接信息:
# application.properties spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= # 如果有密码 spring.redis.database=0
2.2 自定义 redis 配置(可选)
通过 java 配置类自定义 redisconnectionfactory:
@configuration
public class redisconfig {
@bean
public redisconnectionfactory redisconnectionfactory() {
return new jedisconnectionfactory();
}
@bean
public redistemplate<string, object> redistemplate() {
redistemplate<string, object> template = new redistemplate<>();
template.setconnectionfactory(redisconnectionfactory());
template.setkeyserializer(new stringredisserializer());
template.setvalueserializer(new genericjackson2jsonredisserializer());
return template;
}
}三、redislockregistry 使用详解
3.1 创建 redislockregistry
通过 redisconnectionfactory 创建锁注册表:
import org.springframework.integration.redis.util.redislockregistry;
@configuration
public class lockconfig {
@bean
public redislockregistry redislockregistry(redisconnectionfactory connectionfactory) {
// 参数说明:
// connectionfactory: redis 连接工厂
// "mylockregistry": 注册表唯一标识
// 30000: 锁过期时间(毫秒)
return new redislockregistry(connectionfactory, "mylockregistry", 30000);
}
}3.2 使用分布式锁
在服务中注入 lockregistry 并获取锁:
@service
public class myservice {
private final lockregistry lockregistry;
public myservice(lockregistry lockregistry) {
this.lockregistry = lockregistry;
}
public void performtask() {
lock lock = lockregistry.obtain("mytasklock");
try {
if (lock.trylock(10, timeunit.seconds)) {
// 执行业务逻辑
}
} catch (interruptedexception e) {
thread.currentthread().interrupt();
} finally {
if (lock.isheldbycurrentthread()) {
lock.unlock();
}
}
}
}3.3 锁的高级配置
- 设置锁过期时间:避免死锁,确保锁在异常情况下自动释放。
- 可重入锁:同一线程可多次获取锁。
- 作用域:不同注册表的锁相互独立。
四、消息通道配置
4.1 出站通道适配器(outbound channel adapter)
将消息发送到 redis:
@bean
public redisoutboundchanneladapter redisoutboundadapter(redistemplate<?, ?> redistemplate) {
redisoutboundchanneladapter adapter = new redisoutboundchanneladapter(redistemplate);
adapter.setchannelname("redisoutboundchannel");
adapter.setoutputchannel(outputchannel()); // 定义输出通道
return adapter;
}
4.2 入站通道适配器(inbound channel adapter)
从 redis 接收消息:
@bean
public redisinboundchanneladapter redisinboundadapter(redistemplate<?, ?> redistemplate) {
redisinboundchanneladapter adapter = new redisinboundchanneladapter(redistemplate);
adapter.setchannelname("redisinboundchannel");
adapter.setoutputchannel(processingchannel()); // 定义处理通道
return adapter;
}
4.3 使用 redismessagestore 存储消息
配置消息存储器:
<bean id="redismessagestore" class="org.springframework.integration.redis.store.redismessagestore">
<constructor-arg ref="redisconnectionfactory"/>
</bean>
<int:aggregator input-channel="inputchannel" output-channel="outputchannel" message-store="redismessagestore"/>五、最佳实践
5.1 版本兼容性
- spring boot 项目:使用 spring boot 的依赖管理,避免手动指定版本。
- 非 spring boot 项目:确保
spring-integration-redis版本与 spring framework 版本匹配(如 spring 5.3.x 对应 spring integration 5.5.x)。
5.2 连接池优化
配置 jedis 连接池:
spring.redis.jedis.pool.max-active=8 spring.redis.jedis.pool.max-idle=8 spring.redis.jedis.pool.min-idle=2
5.3 序列化配置
使用 json 序列化避免数据乱码:
@bean
public redistemplate<string, object> redistemplate(redisconnectionfactory factory) {
redistemplate<string, object> template = new redistemplate<>();
template.setconnectionfactory(factory);
template.setkeyserializer(new stringredisserializer());
template.setvalueserializer(new genericjackson2jsonredisserializer());
return template;
}
5.4 测试 redis 连接
编写单元测试验证配置:
@springboottest
public class redisintegrationtest {
@autowired
private redistemplate<string, object> redistemplate;
@test
void testredisconnection() {
redistemplate.opsforvalue().set("testkey", "testvalue");
object value = redistemplate.opsforvalue().get("testkey");
assertequals("testvalue", value);
}
}六、常见问题
6.1classnotfoundexception
- 原因:依赖缺失或版本冲突。
- 解决方案:检查
pom.xml或build.gradle是否正确添加依赖,清理 maven/gradle 缓存后重新构建。
6.2 锁无法释放
- 原因:未正确处理锁的释放逻辑。
- 解决方案:确保在
finally块中调用unlock(),并检查锁是否由当前线程持有。
6.3 消息丢失
- 原因:未正确配置持久化或消息存储。
- 解决方案:使用
redismessagestore存储消息,并配置 redis 的持久化策略(如 rdb 或 aof)。
通过以上步骤,您可以充分利用 spring integration redis 的功能,实现高效的分布式锁和消息传递。
到此这篇关于spring integration redis 使用示例详解的文章就介绍到这了,更多相关spring integration redis 使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论