redis 超時失效key 的監聽觸發


https://www.cnblogs.com/chen-lhx/p/6626371.html

 

1. 事件通過 Redis 的訂閱與發布功能(pub/sub)來進行分發,故需要訂

閱 __keyevent@0__:expired 通道

0表示db0 根據自己的dbindex選擇合適的數字

 

2. 修改 redis.conf 文件 

修改 notify-keyspace-events Ex 

復制代碼
# K    鍵空間通知,以__keyspace@<db>__為前綴
# E    鍵事件通知,以__keysevent@<db>__為前綴
# g    del , expipre , rename 等類型無關的通用命令的通知, ...
# $    String命令
# l    List命令
# s    Set命令
# h    Hash命令
# z    有序集合命令
# x    過期事件(每次key過期時生成)
# e    驅逐事件(當key在內存滿了被清除時生成)
# A    g$lshzxe的別名,因此”AKE”意味着所有的事件
復制代碼

3. 重啟redis , 即可測試失效事件的觸發, 監聽獲取的值為 key

 

<java>

1.  首先需要一個消息監聽器類

復制代碼
package com.sogou.baike.testimport.testSubscribe;  
  
import redis.clients.jedis.JedisPubSub;  
  
/**  
 * Created by denglinjie on 2016/6/29.  
 */  
public class RedisMsgPubSubListener extends JedisPubSub {  
    @Override  
    public void unsubscribe() {  
        super.unsubscribe();  
    }  
  
    @Override  
    public void unsubscribe(String... channels) {  
        super.unsubscribe(channels);  
    }  
  
    @Override  
    public void subscribe(String... channels) {  
        super.subscribe(channels);  
    }  
  
    @Override  
    public void psubscribe(String... patterns) {  
        super.psubscribe(patterns);  
    }  
  
    @Override  
    public void punsubscribe() {  
        super.punsubscribe();  
    }  
  
    @Override  
    public void punsubscribe(String... patterns) {  
        super.punsubscribe(patterns);  
    }  
  
    @Override  
    public void onMessage(String channel, String message) {  
        System.out.println("channel:" + channel + "receives message :" + message);  
        this.unsubscribe();  
    }  
  
    @Override  
    public void onPMessage(String pattern, String channel, String message) {  
  
    }  
  
    @Override  
    public void onSubscribe(String channel, int subscribedChannels) {  
        System.out.println("channel:" + channel + "is been subscribed:" + subscribedChannels);  
    }  
  
    @Override  
    public void onPUnsubscribe(String pattern, int subscribedChannels) {  
  
    }  
  
    @Override  
    public void onPSubscribe(String pattern, int subscribedChannels) {  
  
    }  
  
    @Override  
    public void onUnsubscribe(String channel, int subscribedChannels) {  
        System.out.println("channel:" + channel + "is been unsubscribed:" + subscribedChannels);  
    }  
}  
復制代碼

該類需要繼承JedisPubSub ,並實現其抽象方法,通過方法的名稱很清楚的看出來,這個監聽器是用來訂閱一個頻道,在訂閱該頻道,取消訂閱,收到消息等狀態會對應調用相關的方法

 

 

2.  訂閱測試

復制代碼
public class TestSubscribe {  
    @Test  
    public void testSubscribe() throws Exception{  
        Jedis jedis = new Jedis("localhost");  
        RedisMsgPubSubListener listener = new RedisMsgPubSubListener();  
        jedis.subscribe(listener, "__keyevent@0__:expired");  
        //other code  
    }  
}  
復制代碼

該類實現對頻道redisChatTest的訂閱監聽,頻道的訂閱,取消訂閱,收到消息都會調用listener對象的對應方法

 

注意:subscribe是一個阻塞的方法,在取消訂閱該頻道前,會一直阻塞在這,只有當取消了訂閱才會執行下面的other code,參考上面代碼,我在onMessage里面收到消息后,調用了this.unsubscribe(); 來取消訂閱,這樣才會執行后面的other code

 

3.  發布消息測試

復制代碼
Public class TestPublish {  
    @Test  
    public void testPublish() throws Exception{  
        Jedis jedis = new Jedis("localhost");  
        jedis.publish("redisChatTest", "我是天才");  
        Thread.sleep(5000);  
        jedis.publish("redisChatTest", "我牛逼");  
        Thread.sleep(5000);  
        jedis.publish("redisChatTest", "哈哈");  
    }  
}  
復制代碼

這個類向頻道redisChatTest發布消息,第二步因為訂閱了該頻道,所以會收到該消息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM