redis key过期通知在一段时间后无法收到通知

博客讲述了作者在使用Redis key过期通知时遇到的问题,即在一段时间后无法收到通知。经过排查发现是由于`tcp-keepalive`配置为0导致订阅连接关闭,但客户端未显示异常。通过将`tcp-keepalive`设置为官方推荐的60秒解决了此问题,确保了心跳检查机制的有效性。此外,文中还提到了SpringBoot订阅Redis过期通知的代码实现及配置注意事项。
摘要由CSDN通过智能技术生成

redis key过期通知在一段时间后无法收到通知

最近基于redis key过期通知做了一个定时器。用来处理一次性定时任务,面向搜索引擎编程的我,三下五除二就copy就完成了
程序刚启动后没什么问题。可以收到正常收到通知(我好厉害,好牛逼,,好开心,可以下班了)
但是历史总是惊人的相似,往往自以为是的我总是会被打脸,第二天早上发现在这个通知一段时间后就再也收不到通知了。。。。。。。。(万马奔腾)

主题来了

不废话了,首先想到的是,订阅连接是不是关闭了,果不其然,订阅连接就是关闭了。
但是为什么我没有看到客户端出现错误或异常呢?估计第三方库还是做得不够完善。

然后我就去读了一把redis的redis.conf
发现其中有一个配置是这样的
在这里插入图片描述

机智的我,看到这个0 格外的扎眼。就觉得他有问题, 在读了他的说明。发现应该就是他的问题,
然后我就把它改成了官方推荐的 60秒,果不其然。不再会订阅断开的问题了。
将 tcp-keepalive 60 即可解决这个问题
这里需要说明下,如果你是 4.x or 5.x版本的redis 默认值是300秒。 3X版本默认值是0

tcp-keepalive说明

tcp-keepalive 0 此配置的作用是检查健康的连接的时间,可以理解为心跳机制(官方建议值为60秒)
如果设置为0则不会检查心跳信息,就会造成连接实际已经断开了。但是客户端不知道,也不会抛异常。

springboot订阅redis过期通知代码

  • maven依赖
 		<dependency
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Spring Boot中,可以使用Spring Data Redis提供的`RedisTemplate`或`StringRedisTemplate`来操作Redis。而要监听一个key过期,可以使用Redis的`keyspace notifications`功能,它可以向客户端发送事件通知,包括key过期事件。 以下是在Spring Boot中监听Redis key过期事件的步骤: 1. 在`application.properties`或`application.yml`中开启Rediskeyspace notifications功能: ```yaml spring.redis: host: localhost port: 6379 password: database: 0 lettuce: pool: max-active: 8 max-wait: -1ms max-idle: 8 min-idle: 0 # 开启 Rediskeyspace notifications 功能 # K: 键空间通知 # E: 键事件通知 # g: 一般性命令通知 # $: 字符串命令通知 # s: 集合命令通知 # l: 列表命令通知 # h: 哈希命令通知 # z: 有序集合命令通知 # x: 过期事件通知 # e: 驱逐事件通知 redis: listener: # 开启过期事件通知 notify-keyspace-events: Ex ``` 2. 创建一个`RedisMessageListenerContainer` Bean来监听Redis的事件: ```java @Bean public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(redisConnectionFactory); return container; } ``` 3. 创建一个`MessageListenerAdapter` Bean,并实现`onMessage`方法: ```java @Bean public MessageListenerAdapter messageListenerAdapter() { return new MessageListenerAdapter(new RedisKeyExpirationListener()); } public class RedisKeyExpirationListener { public void onMessage(Message message, byte[] pattern) { String expiredKey = message.toString(); // 这里可以写你要执行的代码 System.out.println("Key expired: " + expiredKey); } } ``` 4. 将`MessageListenerAdapter` Bean和要监听的key的pattern注册到`RedisMessageListenerContainer`中: ```java @Autowired private RedisMessageListenerContainer redisMessageListenerContainer; @Autowired private MessageListenerAdapter messageListenerAdapter; @PostConstruct public void init() { // 要监听的key的pattern String pattern = "__keyevent@0__:expired"; redisMessageListenerContainer.addMessageListener(messageListenerAdapter, new PatternTopic(pattern)); } ``` 以上就是在Spring Boot中监听Redis key过期事件的完整步骤。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值