Spring Boot 监听 Redis 指定 Key 过期
在现代开发中,Redis 是一种高性能的内存数据库,广泛应用于缓存、消息队列等场景。而在一些业务中,我们需要对 Redis 中特定 Key 的过期进行监听,以便在 Key 过期时执行特定的逻辑。本文将为刚入行的小白详细介绍如何在 Spring Boot 中实现对 Redis 指定 Key 过期的监听。
整体流程
在实现的过程中,我们可以将整个流程分为以下几个步骤,如下表所示:
步骤 | 描述 |
---|---|
1 | 添加依赖 |
2 | 配置 Redis |
3 | 实现过期通知 |
4 | 创建 Redis 配置类 |
5 | 测试监听功能 |
1. 添加依赖
首先,在 Spring Boot 项目中添加 Redis 相关的依赖。打开 pom.xml
文件,添加以下依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
2. 配置 Redis
然后,在 application.yml
中配置 Redis 连接信息:
spring:
redis:
host: localhost
port: 6379
3. 实现过期通知
在 Redis 中,可以通过使用 Keyspace Notification
来实现对 Key 过期的监听。要启用这种通知机制,我们需要在 Redis 配置文件中添加以下行:
notify-keyspace-events Ex
4. 创建 Redis 配置类
接下来,创建一个配置类,用于设置 Redis 的发布/订阅模式及监听器。新建一个 RedisConfig.java
文件,代码如下:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
@Configuration
public class RedisConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(listenerAdapter, new ChannelTopic("__keyevent@0__:expired"));
return container;
}
@Bean
MessageListenerAdapter listenerAdapter() {
return new MessageListenerAdapter(new KeyExpiredListener());
}
}
- 上述代码中,我们创建了一个
RedisMessageListenerContainer
,它用来监听 Redis 服务中发布的消息。我们将监听到的消息交给KeyExpiredListener
来处理。
5. 创建过期监听器
接下来,创建一个监听器类 KeyExpiredListener.java
,代码如下:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class KeyExpiredListener {
private static final Logger logger = LoggerFactory.getLogger(KeyExpiredListener.class);
public void onMessage(String message) {
// 当监听到 key 过期时,这个方法会被调用
logger.info("Key expired: " + message);
// 在这里执行业务逻辑
}
}
- 该类用来处理 Redis Key 过期的事件,并可以在
onMessage
方法中执行业务逻辑。
状态图
以下是系统的状态图,展示了 Redis Key 的过期流程:
stateDiagram-v2
[*] --> Created
Created --> Expiring : Time passes
Expiring --> Expired : Key expired
Expired --> [*]
测试监听功能
最后,您可以通过代码测试该功能。在某个服务或控制器中,设置一个 Key 的值,并同时设置其过期时间,例如:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
public class RedisService {
@Autowired
private RedisTemplate<String, String> redisTemplate;
public void setKeyWithExpiration(String key, String value, long timeout) {
redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
}
}
例如在其他服务中调用:
@Autowired
private RedisService redisService;
public void test() {
redisService.setKeyWithExpiration("testKey", "testValue", 10); // Key将在10秒后过期
}
甘特图
以下是功能开发的甘特图,展示了每一步骤的实施过程:
gantt
title Redis Key 过期监听实现
dateFormat YYYY-MM-DD
section 准备工作
添加依赖 :a1, 2021-01-01, 1d
配置 Redis :a2, 2021-01-02, 1d
section 实现
创建 Redis 配置类 :b1, 2021-01-03, 2d
创建过期监听器 :b2, 2021-01-05, 2d
测试监听功能 :b3, 2021-01-07, 1d
结尾
通过以上步骤,我们成功实现了在 Spring Boot 中监听 Redis 指定 Key 的过期事件。当我们对 Redis 中的特定 Key 设置过期时间后,可以在过期后自动处理相关逻辑,如清理缓存、发送通知等。希望本文对你理解 Redis 过期监听有所帮助,如果你在实现过程中遇到任何问题,欢迎讨论交流!