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
參考圖爲:
在這裏插入圖片描述

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