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

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>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
  • redis配置类

    /**
     * 加入rediskey过期通知事件
     * @param connectionFactory
     * @return
     */
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired")); //__keyevent@0__:expired这表示 只接收0号库的key过期通知
        return container;
    }
  • key过期监听通知
/**
* 接收key过期通知
*/
@Log4j2
public class RedisExpiredListener implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] bytes) {
        String expiredKey = new String(message.getBody());
        byte[] channel = message.getChannel();
        log.info("redis key 过期  key = {} , channel {} ", expiredKey,new String(channel));
    }

}

注意

redis配置中需要 notify-keyspace-events Ex
参考图为:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章