Lettuce-core项目Redis连接配置完全指南
引言
在现代Java应用中,与Redis交互已成为常见需求。Lettuce-core作为一款高性能的Redis客户端,提供了灵活多样的连接配置方式。本文将全面解析Lettuce-core中Redis连接的配置方法,帮助开发者根据实际场景选择最适合的连接方案。
连接基础:RedisURI详解
RedisURI是Lettuce-core中统一表示Redis连接信息的核心类,它封装了主机、端口、认证信息、数据库选择等关键参数。创建RedisURI主要有三种方式:
1. URI字符串方式
// 基础连接
RedisURI.create("redis://localhost/");
// 带认证和数据库选择
RedisURI.create("redis://password@localhost:6379/1");
// SSL连接
RedisURI.create("rediss://password@localhost:6379/1");
URI方式简洁直观,适合配置简单的场景。
2. Builder模式
RedisURI.Builder.redis("localhost", 6379)
.auth("password")
.database(1)
.timeout(60, TimeUnit.SECONDS)
.build();
Builder模式提供了链式调用的便利性,适合需要精细配置的场景。
3. 直接构造
new RedisURI("localhost", 6379, 60, TimeUnit.SECONDS);
直接构造适合需要程序化配置的场景,但灵活性较差。
连接类型与URI语法
Lettuce-core支持多种Redis部署模式和连接方式,对应的URI语法也有所不同:
1. Redis单机模式
redis://[[username:]password@]host[:port][/database][?timeout=60s]
redis
:普通TCP连接rediss
:SSL/TLS加密连接redis-socket
:Unix域套接字连接
2. Redis哨兵模式
redis-sentinel://[[username:]password@]host1[:port1][,host2[:port2]][/database][?sentinelMasterId=masterName]
3. 超时单位说明
d
:天h
:小时m
:分钟s
:秒ms
:毫秒us
:微秒ns
:纳秒
认证机制详解
1. 基础认证
// 用户名+密码
RedisURI.create("redis://username:password@localhost");
// 仅密码
RedisURI.create("redis://password@localhost");
注意:Redis 6+才支持用户名认证。
2. 哨兵模式特殊处理
哨兵模式下,URI中的认证信息仅适用于数据节点。每个哨兵节点的认证需要单独配置。
高级认证方案
1. 流式凭据提供者
适用于需要动态更新认证信息的场景,如凭证轮换、令牌过期等。
// 自定义流式凭据提供者
public class DynamicCredentialsProvider implements RedisCredentialsProvider {
private final Sinks.Many<RedisCredentials> sink = Sinks.many().replay().latest();
@Override
public boolean supportsStreaming() { return true; }
@Override
public Mono<RedisCredentials> resolveCredentials() {
return sink.asFlux().next();
}
@Override
public Flux<RedisCredentials> credentials() {
return sink.asFlux().onBackpressureLatest();
}
public void updateCredentials(String user, char[] pass) {
sink.tryEmitNext(new StaticRedisCredentials(user, pass));
}
}
// 使用示例
DynamicCredentialsProvider provider = new DynamicCredentialsProvider();
provider.updateCredentials("user", "pass".toCharArray());
RedisURI uri = RedisURI.builder()
.withHost("localhost")
.withAuthentication(provider)
.build();
ClientOptions options = ClientOptions.builder()
.reauthenticateBehavior(ON_NEW_CREDENTIALS)
.build();
RedisClient client = RedisClient.create(uri);
client.setOptions(options);
2. Microsoft Entra ID认证
适用于Azure Redis服务的企业级认证方案。
// 配置Entra ID认证
try (EntraIDTokenAuthConfigBuilder builder = EntraIDTokenAuthConfigBuilder.builder()) {
builder.clientId("client-id")
.secret("client-secret")
.authority("https://login.microsoftonline.com/tenant-id")
.scopes("https://redis.azure.com/.default");
TokenBasedRedisCredentialsProvider credentials =
TokenBasedRedisCredentialsProvider.create(builder.build());
RedisURI uri = RedisURI.builder()
.withHost("azure-redis-host")
.withSsl(true)
.withAuthentication(credentials)
.build();
RedisClient client = RedisClient.create(uri);
client.setOptions(ClientOptions.builder()
.reauthenticateBehavior(ON_NEW_CREDENTIALS)
.build());
// 使用连接...
}
连接生命周期管理最佳实践
RedisClient client = RedisClient.create("redis://localhost");
try {
StatefulRedisConnection<String, String> connection = client.connect();
try {
RedisCommands<String, String> commands = connection.sync();
// 业务操作...
} finally {
connection.close();
}
} finally {
client.shutdown();
}
关键点:
- 连接应长期保持,避免频繁创建销毁
- 确保最终关闭连接和客户端
- 合理设置超时时间(默认60秒)
异常处理
Lettuce-core中的异常都是RuntimeException:
RedisException
:基础异常RedisCommandExecutionException
:Redis返回错误时的异常
建议在业务代码中妥善处理这些异常,特别是网络不稳定环境。
总结
Lettuce-core提供了灵活多样的Redis连接配置方式,从简单的URI字符串到复杂的企业级认证方案。开发者应根据实际需求选择最适合的方案,并遵循连接生命周期管理的最佳实践,以构建稳定高效的Redis应用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考