在现代分布式系统中,Redis作为高性能的内存数据库,广泛应用于缓存、会话存储、消息队列等场景。随着业务复杂度增加,单个Redis实例可能无法满足需求,例如:
本文将详细介绍如何在Java项目中同时连接多个Redis实例,涵盖Jedis、Lettuce、Spring Boot + RedisTemplate三种主流方式,并提供完整代码示例和最佳实践建议。
@Primary 注解指定主实例RedisTemplate管理多个实例user:redis 存储用户数据,order:redis 存储订单数据Jedis是Redis官方推荐的Java客户端,适用于简单场景。
import redis.clients.jedis.Jedis;
public class JedisMultiInstanceExample {
public static void main(String[] args) {
// 连接第一个Redis实例
Jedis jedis1 = new Jedis("redis1.example.com", 6379);
jedis1.auth("password1"); // 认证(如有密码)
jedis1.set("key1", "value1");
System.out.println("Redis1 value: " + jedis1.get("key1"));
// 连接第二个Redis实例
Jedis jedis2 = new Jedis("redis2.example.com", 6379);
jedis2.auth("password2");
jedis2.set("key2", "value2");
System.out.println("Redis2 value: " + jedis2.get("key2"));
// 关闭连接
jedis1.close();
jedis2.close();
}
}import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolMultiInstance {
public static void main(String[] args) {
// 配置连接池
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(10); // 最大连接数
// 第一个Redis连接池
JedisPool jedisPool1 = new JedisPool(poolConfig, "redis1.example.com", 6379, 1000, "password1");
// 第二个Redis连接池
JedisPool jedisPool2 = new JedisPool(poolConfig, "redis2.example.com", 6379, 1000, "password2");
try (Jedis jedis1 = jedisPool1.getResource()) {
jedis1.set("key1", "value1");
}
try (Jedis jedis2 = jedisPool2.getResource()) {
System.out.println(jedis2.get("key2"));
}
jedisPool1.close();
jedisPool2.close();
}
}优点:
缺点:
Lettuce是Spring Boot默认的Redis客户端,支持异步IO,适用于高并发场景。
import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.sync.RedisCommands;
public class LettuceMultiInstanceExample {
public static void main(String[] args) {
// 第一个Redis实例
RedisClient client1 = RedisClient.create("redis://password1@redis1.example.com:6379/0");
StatefulRedisConnection<String, String> connection1 = client1.connect();
RedisCommands<String, String> commands1 = connection1.sync();
commands1.set("key1", "value1");
// 第二个Redis实例
RedisClient client2 = RedisClient.create("redis://password2@redis2.example.com:6379/0");
StatefulRedisConnection<String, String> connection2 = client2.connect();
RedisCommands<String, String> commands2 = connection2.sync();
System.out.println(commands2.get("key2"));
// 关闭连接
connection1.close();
connection2.close();
client1.shutdown();
client2.shutdown();
}
}import io.lettuce.core.cluster.RedisClusterClient;
import io.lettuce.core.cluster.api.StatefulRedisClusterConnection;
import io.lettuce.core.cluster.api.sync.RedisAdvancedClusterCommands;
public class LettuceClusterExample {
public static void main(String[] args) {
// 第一个Redis集群
RedisClusterClient clusterClient1 = RedisClusterClient.create("redis://password1@redis-cluster1.example.com:6379");
StatefulRedisClusterConnection<String, String> clusterConnection1 = clusterClient1.connect();
RedisAdvancedClusterCommands<String, String> clusterCommands1 = clusterConnection1.sync();
clusterCommands1.set("cluster-key1", "value1");
// 第二个Redis集群
RedisClusterClient clusterClient2 = RedisClusterClient.create("redis://password2@redis-cluster2.example.com:6379");
StatefulRedisClusterConnection<String, String> clusterConnection2 = clusterClient2.connect();
RedisAdvancedClusterCommands<String, String> clusterCommands2 = clusterConnection2.sync();
System.out.println(clusterCommands2.get("cluster-key2"));
clusterConnection1.close();
clusterConnection2.close();
clusterClient1.shutdown();
clusterClient2.shutdown();
}
}优点:
缺点:
Spring Boot提供了RedisTemplate,可以方便地管理多个Redis实例。
application.ymlspring:
redis:
host: redis1.example.com
port: 6379
password: password1
redis-secondary:
host: redis2.example.com
port: 6379
password: password2RedisTemplate@Configuration
public class RedisConfig {
@Autowired
private Environment env;
@Bean
@Primary
public RedisConnectionFactory primaryRedisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName(env.getProperty("spring.redis.host"));
config.setPort(Integer.parseInt(env.getProperty("spring.redis.port")));
config.setPassword(env.getProperty("spring.redis.password"));
return new LettuceConnectionFactory(config);
}
@Bean
public RedisConnectionFactory secondaryRedisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName(env.getProperty("spring.redis-secondary.host"));
config.setPort(Integer.parseInt(env.getProperty("spring.redis-secondary.port")));
config.setPassword(env.getProperty("spring.redis-secondary.password"));
return new LettuceConnectionFactory(config);
}
@Bean
@Primary
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(primaryRedisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
@Bean(name = "secondaryRedisTemplate")
public RedisTemplate<String, Object> secondaryRedisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(secondaryRedisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}RedisTemplate@Service
public class RedisService {
@Autowired
private RedisTemplate<String, Object> redisTemplate; // 主实例
@Autowired
@Qualifier("secondaryRedisTemplate")
private RedisTemplate<String, Object> secondaryRedisTemplate; // 次实例
public void saveToPrimary(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
public Object getFromSecondary(String key) {
return secondaryRedisTemplate.opsForValue().get(key);
}
}优点:
缺点:
maxTotal(最大连接数)、maxIdle(最大空闲连接)Jedis.close()或Lettuce.shutdown()调用,避免连接泄漏RedisMonitor或Prometheus + Grafana监控多个Redis实例方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
Jedis | 小型项目 | 简单易用 | 手动管理连接 |
Lettuce | 高并发场景 | 支持异步IO | 配置稍复杂 |
Spring Boot + RedisTemplate | 企业级应用 | 集成Spring生态 | 需要额外配置 |
推荐选择:
通过本文的代码示例和方案对比,你可以轻松实现Java项目连接多个Redis实例,优化系统性能! 🚀