Lettuce 是一个高性能的 Redis 客户端,支持主从模式、哨兵模式和 Cluster 模式的 Redis 集群。以下是针对这三种模式的配置和创建方法:
一、主从模式
在主从模式下,Lettuce 可以通过 MasterReplica
类来连接 Redis 主从服务器。主从模式支持读写分离,可以通过设置 ReadFrom
策略来指定读取数据的来源。
-
添加依赖:
<dependency> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> <version>最新版本</version> </dependency>
-
配置连接:
import io.lettuce.core.RedisClient; import io.lettuce.core.RedisURI; import io.lettuce.core.api.StatefulRedisConnection; import io.lettuce.core.api.sync.RedisCommands; import io.lettuce.core.masterreplica.MasterReplica; import io.lettuce.core.masterreplica.StatefulRedisMasterReplicaConnection; public class RedisMasterReplicaExample { public static void main(String[] args) { // 配置主从服务器的地址和端口 RedisURI masterUri = RedisURI.create("redis://master-host:6379"); RedisURI replicaUri1 = RedisURI.create("redis://replica1-host:6379"); RedisURI replicaUri2 = RedisURI.create("redis://replica2-host:6379"); // 创建 MasterReplica 实例 MasterReplica<String, String> masterReplica = MasterReplica.create(masterUri, replicaUri1, replicaUri2); // 创建连接 StatefulRedisMasterReplicaConnection<String, String> connection = masterReplica.connect(); // 设置读取策略(可选) connection.setReadFrom(ReadFrom.REPLICA_PREFERRED); // 优先从从服务器读取数据 // 获取同步命令接口 RedisCommands<String, String> commands = connection.sync(); // 执行命令 commands.set("key", "value"); String value = commands.get("key"); System.out.println(value); // 关闭连接 connection.close(); masterReplica.shutdown(); } }
二、哨兵模式
在哨兵模式下,Lettuce 可以通过 RedisSentinelClient
类来连接 Redis 哨兵系统,哨兵系统负责监控主从服务器的状态,并在主服务器故障时进行故障转移。
-
添加依赖(同主从模式)。
-
配置连接:
import io.lettuce.core.RedisClient; import io.lettuce.core.RedisURI; import io.lettuce.core.api.StatefulRedisConnection; import io.lettuce.core.api.sync.RedisCommands; import io.lettuce.core.sentinel.RedisSentinelClient; import io.lettuce.core.sentinel.api.StatefulRedisSentinelConnection; import io.lettuce.core.sentinel.api.sync.RedisSentinelCommands; public class RedisSentinelExample { public static void main(String[] args) { // 配置哨兵服务器的地址和端口 RedisURI sentinelUri1 = RedisURI.create("redis://sentinel1-host:26379"); RedisURI sentinelUri2 = RedisURI.create("redis://sentinel2-host:26379"); RedisURI sentinelUri3 = RedisURI.create("redis://sentinel3-host:26379"); // 创建 RedisSentinelClient 实例 RedisSentinelClient sentinelClient = RedisSentinelClient.create(); // 连接哨兵服务器 StatefulRedisSentinelConnection<String, String> sentinelConnection = sentinelClient.connect(sentinelUri1); // 可以连接多个哨兵服务器以提高可用性 // 获取同步命令接口 RedisSentinelCommands<String, String> sentinelCommands = sentinelConnection.sync(); // 获取主服务器信息 String masterName = "mymaster"; String masterHost = sentinelCommands.getMasterAddrByName(masterName).getHost(); int masterPort = sentinelCommands.getMasterAddrByName(masterName).getPort(); // 根据主服务器信息创建 RedisClient 实例并连接(此处省略具体代码) // ... // 关闭连接 sentinelConnection.close(); sentinelClient.shutdown(); } }
更简洁的配置方式(使用 Spring Boot 自动配置):
-
添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
配置
application.properties
或application.yml
:# application.properties 配置示例 spring.redis.sentinel.master=mymaster spring.redis.sentinel.nodes=sentinel1-host:26379,sentinel2-host:26379,sentinel3-host:26379
# application.yml 配置示例 spring: redis: sentinel: master: mymaster nodes: sentinel1-host:26379,sentinel2-host:26379,sentinel3-host:26379
-
使用
RedisTemplate
操作 Redis(Spring Boot 会自动配置RedisConnectionFactory
和RedisTemplate
):import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class RedisController { @Autowired private RedisTemplate<String, String> redisTemplate; @GetMapping("/set") public String set(String key, String value) { redisTemplate.opsForValue().set(key, value); return "OK"; } @GetMapping("/get") public String get(String key) { return redisTemplate.opsForValue().get(key); } }
三、Cluster 模式
在 Cluster 模式下,Lettuce 可以通过 RedisClusterClient
类来连接 Redis 集群。Redis 集群将数据分布在多个节点上,提供了更高的可用性和扩展性。
-
添加依赖(同主从模式)。
-
配置连接:
import io.lettuce.core.RedisURI; import io.lettuce.core.cluster.RedisClusterClient; import io.lettuce.core.cluster.api.StatefulRedisClusterConnection; import io.lettuce.core.cluster.api.sync.RedisAdvancedClusterCommands; public class RedisClusterExample { public static void main(String[] args) { // 配置集群节点的地址和端口 RedisURI node1 = RedisURI.create("redis://cluster-node1-host:7000"); RedisURI node2 = RedisURI.create("redis://cluster-node2-host:7001"); RedisURI node3 = RedisURI.create("redis://cluster-node3-host:7002"); // 创建 RedisClusterClient 实例 RedisClusterClient clusterClient = RedisClusterClient.create(node1, node2, node3); // 创建连接 StatefulRedisClusterConnection<String, String> connection = clusterClient.connect(); // 获取同步命令接口 RedisAdvancedClusterCommands<String, String> commands = connection.sync(); // 执行命令(Lettuce 会自动将命令路由到正确的节点) commands.set("key", "value"); String value = commands.get("key"); System.out.println(value); // 关闭连接 connection.close(); clusterClient.shutdown(); } }
使用 Spring Boot 自动配置 Cluster 模式:
-
添加依赖(同哨兵模式)。
-
配置
application.properties
或application.yml
:# application.properties 配置示例 spring.redis.cluster.nodes=cluster-node1-host:7000,cluster-node2-host:7001,cluster-node3-host:7002
# application.yml 配置示例 spring: redis: cluster: nodes: cluster-node1-host:7000,cluster-node2-host:7001,cluster-node3-host:7002