SpringBoot监听redis过期key处理

本文介绍如何通过继承KeyExpirationEventMessageListener来实现Redis键过期监听功能。包括单机模式下的简单实现及集群模式下的加锁处理,以防止重复消费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继承KeyExpirationEventMessageListener实现redis的key失效监听。

单机模式下:

@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {


    @Resource
    @Lazy
    RedisUtil redisUtil;

    public RedisKeyExpirationListener(RedisMessageListenerContainer redisMessageListenerContainer) {
        super(redisMessageListenerContainer);
    }

    /**
     * 针对 redis 数据失效事件,进行数据处理
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
 			// 进行业务处理
     		// 过期的key就是message
    }
}

集群模式下:
在集群模式下服务都会收到过期通知,如果不加锁会出现重复消费,使用redis的setNx对过期key进行加锁,保证只有一个服务key进行消费不会重复消费。

### Spring Boot 中实现监听 Redis过期键功能 要在 Spring Boot 应用程序中实现监听 Redis过期键功能,可以通过继承 `KeyExpirationEventMessageListener` 类并重写其方法来完成。以下是完整的解决方案: #### 实现步骤说明 1. **引入依赖** 确保项目中已经引入了 Spring Data Redis 和 Lettuce 或 Jedis 作为连接器的相关依赖。 2. **配置 Redis 消息侦听容器** 创建一个 `RedisMessageListenerContainer` 并将其注入到自定义的监听器中。 3. **创建自定义监听器类** 自定义监听器需继承 `KeyExpirationEventMessageListener`,并通过构造函数传入消息侦听容器实例。 4. **启用 Redis Keyspace Notifications** 在 Redis 配置中开启 keyspace events 功能,具体命令为:`CONFIG SET notify-keyspace-events Ex`. --- #### 示例代码 ```java // 引入必要的包 import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.listener.KeyExpirationEventMessageListener; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Component public class MyRedisKeyExpirationListener extends KeyExpirationEventMessageListener { private static final Logger log = LoggerFactory.getLogger(MyRedisKeyExpirationListener.class); /** * 构造函数初始化父类 * * @param listenerContainer 注入的消息侦听容器 */ public MyRedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } /** * 当有 key 到期时触发此方法 * * @param message 超时的 key 值 * @param pattern 订阅模式 (可忽略) */ @Override public void onMessage(Message message, byte[] pattern) { String expiredKey = new String(message.getBody()); log.info("捕获到已到期的 key: {}", expiredKey); // 打印日志记录超时的 key } } ``` --- #### 启动 Redis Keyspace Events 为了使 Redis 支持 keyspace notification,需要执行以下命令(假设使用 Docker 容器内的 Redis CLI): ```bash docker exec -it <container_id> redis-cli CONFIG SET notify-keyspace-events Ex ``` 这一步非常重要,因为默认情况下 Redis 不会发送 keyspace event[^4]。 --- #### 测试验证 在 Redis 客户端中订阅过期事件通道以确认是否正常工作: ```bash PSUBSCRIBE __keyevent@*__:expired ``` 接着,在应用程序中设置带有 TTL 的键值对,并观察控制台输出的日志信息。 --- #### 注意事项 - 如果未成功收到过期事件,请检查 Redis 是否正确启用了 keyspace notifications。 - 使用 Docker 时,确保能够访问容器内部运行的 Redis CLI 工具[^2]。 - 日志级别应调整至 DEBUG 或 INFO 来查看具体的监听行为[^1]。 --- ### 总结 通过以上方式可以在 Spring Boot 中轻松实现对 Redis 键值对过期时间的监控。该方案利用了 Redis 提供的数据变更通知机制以及 Spring Data Redis 封装好的 API 接口[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值