Redis 可以在多种配置下运行。每种运行模式都需要特定的配置,这些配置在接下来的章节中有详细解释。
一、单节点
单节点连接 Redis 服务。
通过配置 LettuceConnectionFactory
或 JedisConnectionFactory
:
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Configuration class RedisStandaloneConfiguration {
@Bean public RedisConnectionFactory lettuceConnectionFactory() { return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379)); } @Bean public RedisConnectionFactory jedisConnectionFactory() { return new JedisConnectionFactory(new RedisStandaloneConfiguration("server", 6379)); } }
|
二、主节点写入从节点读取
Redis 主从部署(不包含自动故障转移)不仅允许数据安全地存储在多个节点上,还可以通过使用 Lettuce 从副本节点读取数据,同时将写操作推送到主节点。你可以通过 LettuceClientConfiguration
设置读写策略,示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Configuration class WriteToMasterReadFromReplicaConfiguration {
@Bean public LettuceConnectionFactory redisConnectionFactory() { LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder() .readFrom(REPLICA_PREFERRED) .build(); RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration("server", 6379); return new LettuceConnectionFactory(serverConfig, clientConfig); } }
|
注意:对于通过 INFO
命令报告非公共地址的环境(例如使用 AWS 时),请使用 RedisStaticMasterReplicaConfiguration
而不是 RedisStandaloneConfiguration
。请注意,RedisStaticMasterReplicaConfiguration
不支持发布/订阅(Pub
/Sub
),因为缺少跨各个服务器的消息传播机制。
三、哨兵模式
为了处理高可用性的 Redis,Spring Data Redis 支持使用 Redis Sentinel,可以通过 RedisSentinelConfiguration
进行配置,示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
@Bean public RedisConnectionFactory lettuceConnectionFactory() { RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration() .master("mymaster") .sentinel("127.0.0.1", 26379) .sentinel("127.0.0.1", 26380); return new LettuceConnectionFactory(sentinelConfig); }
@Bean public RedisConnectionFactory jedisConnectionFactory() { RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration() .master("mymaster") .sentinel("127.0.0.1", 26379) .sentinel("127.0.0.1", 26380); return new JedisConnectionFactory(sentinelConfig); }
|
RedisSentinelConfiguration
还可以通过 RedisSentinelConfiguration.of(PropertySource)
定义,这允许设置以下属性:
- spring.redis.sentinel.master:主节点的名称。
- spring.redis.sentinel.nodes:用逗号分隔的 host:port 列表。
- spring.redis.sentinel.username:用于 Redis Sentinel 认证的用户名(需要 Redis 6 版本)。
- spring.redis.sentinel.password:用于 Redis Sentinel 认证的密码。
- spring.redis.sentinel.dataNode.username:用于 Redis 数据节点认证的用户名。
- spring.redis.sentinel.dataNode.password:用于 Redis 数据节点认证的密码。
- spring.redis.sentinel.dataNode.database:用于 Redis 数据节点认证的数据库索引。
有时需要直接与某个 Sentinel 交互。可以使用 RedisConnectionFactory.getSentinelConnection()
或 RedisConnection.getSentinelCommands()
来访问配置的第一个活跃的 Sentinel。
四、集群模式
RedisClusterConnection
是 RedisConnection
的扩展,负责与 Redis 集群的通信,并将错误转换为 Spring DAO 异常层次结构。RedisClusterConnection
实例通过 RedisConnectionFactory
创建,该工厂需要使用相应的 RedisClusterConfiguration
进行设置,示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| @Component @ConfigurationProperties(prefix = "spring.redis.cluster") public class ClusterConfigurationProperties {
List<String> nodes;
public List<String> getNodes() { return nodes; }
public void setNodes(List<String> nodes) { this.nodes = nodes; } }
@Configuration public class AppConfig {
@Autowired ClusterConfigurationProperties clusterProperties;
@Bean public RedisConnectionFactory connectionFactory() {
return new LettuceConnectionFactory(new RedisClusterConfiguration(clusterProperties.getNodes())); } }
|
RedisClusterConfiguration
也可以通过 RedisClusterConfiguration.of(PropertySource)
定义,这允许你设置以下属性:
- spring.redis.cluster.nodes:用逗号分隔的 host:port 列表。
- spring.redis.cluster.max-redirects:允许的集群重定向次数。
初始配置将驱动库指向一组初始的集群节点。由于集群动态重新配置而产生的更改仅保存在原生驱动中,且不会写回到配置文件。
五、Spring 源码
RedisConfiguration 层次结构
相关链接
Connection Modes :: Spring Data Redis
OB links
#Spring #Redis