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 过期监听有所帮助,如果你在实现过程中遇到任何问题,欢迎讨论交流!