Redis 可以在多种配置下运行。每种运行模式都需要特定的配置,这些配置在接下来的章节中有详细解释。

一、单节点

单节点连接 Redis 服务。

通过配置 LettuceConnectionFactoryJedisConnectionFactory

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
/**
* Lettuce
*/
@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);
}

/**
* Jedis
*/
@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。

四、集群模式

RedisClusterConnectionRedisConnection 的扩展,负责与 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 {

/*
* spring.redis.cluster.nodes[0] = 127.0.0.1:7379
* spring.redis.cluster.nodes[1] = 127.0.0.1:7380
* ...
*/
List<String> nodes;

/**
* Get initial collection of known cluster nodes in format {@code host:port}.
*
* @return
*/
public List<String> getNodes() {
return nodes;
}

public void setNodes(List<String> nodes) {
this.nodes = nodes;
}
}

@Configuration
public class AppConfig {

/**
* Type safe representation of application.properties
*/
@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 tags

#Spring #Redis