redis 超時失效key 的監聽觸發

1. 事件經過 Redis 的訂閱與發佈功能(pub/sub)來進行分發,故須要訂java

閱 __keyevent@0__:expired 通道redis

0表示db0 根據本身的dbindex選擇合適的數字ide

 

2. 修改 redis.conf 文件 測試

修改 notify-keyspace-events Ex this

複製代碼
# 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 , 便可測試失效事件的觸發, 監聽獲取的值爲 keyspa

 

<java>code

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 ,並實現其抽象方法,經過方法的名稱很清楚的看出來,這個監聽器是用來訂閱一個頻道,在訂閱該頻道,取消訂閱,收到消息等狀態會對應調用相關的方法blog

 

 

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發佈消息,第二步由於訂閱了該頻道,因此會收到該消息。

相關文章
相關標籤/搜索