Spring Boot Redis 主从模式及过期 key 指定频道
介绍
Redis 是一种高性能的键值存储数据库,它支持多种数据结构并提供持久化功能。在分布式系统中,为了提高可用性和性能,可以采用 Redis 的主从模式。
Spring Boot 是一个基于 Spring 框架的快速开发企业级应用的框架。它提供了丰富的功能和便捷的配置,可以很方便地与 Redis 进行集成。
本文将介绍如何在 Spring Boot 中使用 Redis 主从模式,并且通过设置过期 key 来触发指定频道的消息发布。
准备工作
在开始之前,我们需要确保已经安装了 Redis,并且可以使用以下命令启动 Redis 服务:
redis-server
同时,我们还需要在 Spring Boot 项目中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置 Redis 主从模式
首先,我们需要在项目的配置文件中添加以下配置信息:
spring:
redis:
host: localhost
port: 6379
password: password
lettuce:
pool:
max-active: 8
max-wait: -1
max-idle: 8
min-idle: 0
timeout: 3000
jedis:
pool:
max-active: 8
max-wait: -1
max-idle: 8
min-idle: 0
cluster:
nodes:
- 127.0.0.1:6379
- 127.0.0.1:6380
- 127.0.0.1:6381
在上述配置中,我们指定了 Redis 的主从节点,其中 127.0.0.1:6379 为主节点,127.0.0.1:6380 和 127.0.0.1:6381 为从节点。
使用 Redis Template 进行操作
Spring Boot 提供了 RedisTemplate 来操作 Redis 数据库。我们可以通过注入 RedisTemplate 对象来使用 Redis 的各种功能。
首先,我们需要在配置类中配置 RedisTemplate:
@Configuration
public class RedisConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory();
connectionFactory.setHostName("localhost");
connectionFactory.setPort(6379);
connectionFactory.setPassword("password");
return connectionFactory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
上述配置中,我们使用 LettuceConnectionFactory 创建了 RedisConnectionFactory,然后通过 RedisTemplate 设置了序列化方式。
接下来,我们可以在业务代码中使用 RedisTemplate 对象来进行操作。以下是一些示例代码:
@RestController
public class RedisController {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@GetMapping("/set")
public void setKey() {
redisTemplate.opsForValue().set("key", "value");
}
@GetMapping("/get")
public Object getKey() {
return redisTemplate.opsForValue().get("key");
}
@GetMapping("/publish")
public void publishMessage() {
redisTemplate.convertAndSend("channel", "message");
}
}
在上述代码中,我们使用 RedisTemplate 的 opsForValue 方法来进行键值对的读写操作,使用 convertAndSend 方法来发布消息到指定的频道。
过期 key 指定频道
为了实现过期 key 指定频道的功能,我们可以在 Redis 配置类中添加以下代码:
@Configuration
public class RedisConfig {
...
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(redisConnectionFactory);
container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@*__:expired"));
return container;
}
}
上述配置中,我们创建了 RedisMessageListenerContainer 对象,并且添加了 RedisExpiredListener 监听器和过期 key 的频道。
然后,我们需要实现 RedisExpiredListener 监