redis 超时失效key 的监听触发

1. 事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发,故需要订

阅 [email protected]__:expired 通道

0表示db0 根据自己的dbindex选择合适的数字

2. 修改 redis.conf 文件 

修改 notify-keyspace-events Ex

# K    键空间通知,以[email protected]<db>__为前缀
# E    键事件通知,以[email protected]<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, "[email protected]__: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发布消息,第二步因为订阅了该频道,所以会收到该消息。

时间: 2024-12-24 10:33:39

redis 超时失效key 的监听触发的相关文章

java中的key事件监听机制

package com.at221; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JFrame; public class TestKey { public static void main(String[] args) { JFrame f = new JFrame(); f.addKeyListener(new MyKeyListener()); f.setVisib

Vue2.X监听data变化的核心API—Object.defineProperty详解

Vue2.X监听data变化的核心API—Object.defineProperty基本使用: Object.defineProperty实现响应式 1.监听对象(简单对象) 上面通过监听get,set方法了解到data变化,进而可以达到响应式. 2.复杂对象(深度监听),深度监听 触发更新视图 // 触发更新视图 function updateView() { console.log('视图更新') } 在上面例子data加: // 准备数据 const data = { name: '佩奇'

js事件监听

通过添加事件监听进一步实现业务处理.可以对同一个元素添加相同的事件监听,执行会从上到下的原则,也可以添加多个事件监听针对同一元素. 针对元素监听: document.getElementById("idName").addEventListener("eventType",functionName);//注意:前面不加on 如click事件 针对window对象监听: window.addEventListener(“resize”,function(){ aler

ios 监听TextField中内容变化

本篇文章只为帮助跟多的人.适合初学者. 在这里我介绍3种监听UITextField的方法.并在最后写了一个小的demo 提供参考. -------请不要纠结小编的命名方式规不规范,一切只为共同学习,共同进步. @property (weak, nonatomic) IBOutlet UITextField *UserID; @property (weak, nonatomic) IBOutlet UITextField *Password; @property (weak, nonatomic)

oracle监听详解

典型的监听配置模板: 创建监听有多重方式:(1)netca (2)netmgr (3)手工编辑listener.ora文件等: 下面是一个监听配置的标准模板: 配置文件中的关键之解析: (1) PROTOCOL指的是监听接收链接的协议: (2) HOST是指的监听运行的主机或者IP地址: (3) PORT指的是监听运行的端口. (4) SID_NAME指的是监听服务的实例名. (5) GLOBAL_NAME指的是监听服务的服务名: (6) ORACLE_HOME指的是监听服务的$ORACLE_H

实现简单的js数据监听

主要是用Object.defineProperty实现类似vue的数据绑定. Object.defineProperty 官方地址 步入正题: 第一步: const data = { name: "tom", age: 14 } Object.defineProperty(data, "name", { get(){ return "name被读取了" }, set(val){ console.log('我被赋值了',val) } }) //将此

Redis集群环境下的键值空间监听事件实现方案

一直想记录工作中遇到的问题和解决的方法,奈何没有找到一方乐土,最近经常反思,是否需要记录平时的点滴,后台还是决定下定决心记录一些,以便以后用到的时候找不着,实现这样的一个功能主要也是业务所需要的. 需求:要求统计所有会员在线人数,并根据会员在线状态同步改变人数. 之前用户登录使用session去控制,那么可以通过session进行在线用户人数统计,后来实现无状态不在依赖session作为用户在线的标准,使用Redis替换了Session,那么用户直接退出也好做,但是会存在用户直接关闭页面的情况,

redis绑定多个监听ip或者取消绑定

如果系统某个端口6379绑定监听ip127.0.0.1,则该端口只会通过来自这个ip的连接请求,拒绝非监听ip主机的连接. telnet 10.10.86.211 9000Trying 10.10.86.211...telnet: connect to address 10.10.86.211: Connection refused 另外一个原因:防火墙拦截.(只需要在被telnet服务器的firewall中放开相应主机ip,端口即可) 若为该端口绑定监听ip,而造成connection ref

关于vue中滚动监听失效问题

在vue项目中, 监听window滚动失效;并且document.body.scrollTop一直是0的情况! 查找了许多资料;并没有找到合理的解决方案; 最中发现,在index.html设置了html,body的宽高设置成了100%; 这样会造成window.onscroll监听不到正确的滚出高度(恒为0); 不和你们多bb:解决方案: 将html,body的height设置为auto;即可解决!!