redis 超时失效key 的监听触发
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发布消息,第二步因为订阅了该频道,所以会收到该消息。
redis 超时失效key 的监听触发的更多相关文章
- redis 超时失效key 的监听触发使用
redis自2.8.0之后版本提供Keyspace Notifications功能,允许客户订阅Pub / Sub频道,以便以某种方式接收影响Redis数据集的事件. 可能收到的事件的例子如下: 所有 ...
- JAVA实现redis超时失效key 的监听触发
过期事件通过Redis的订阅与发布功能(pub/sub)来进行分发. 而对超时的监听呢,并不需要自己发布,只有修改配置文件redis.conf中的:notify-keyspace-events Ex, ...
- redis过期事件,swoole监听
$serv = new Swoole\Server('0.0.0.0', 9501, SWOOLE_BASE, SWOOLE_SOCK_TCP); $serv->set(array( 'work ...
- waypoint+animate元素滚动监听触发插件实现页面动画效果
最近在做一个官网类型滚动加载动画,使用到waypoint监听事件插件和animate动画样式,两者结合完美实现向下滚动加载动画,但是没有做向上滚动撤消动画,留待以后有空研究 首先来介绍下jquery. ...
- layui 事件监听触发
1:监听select 改变 <!-- 不用form 用div也可以 --> <form class="layui-form"> <div class= ...
- java中的key事件监听机制
package com.at221; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.sw ...
- Redis集群下过期key监听
1. 前言 在使用redis集群时,发现过期key始终监听不到.网上也没有现成的解决方案.于是想,既然不能监听集群,那我可以建立多个redis连接,分别对每个redis的key过期进行监听.以上做法可 ...
- spring boot 实现redis 的key的过期监听,执行自己的业务
最近几天进一步了解了一下redis,发现了key的过期监听功能,实现方式如下: 在redis的配置文件 redis.conf 中找到"EVENT NOTIFICATION"模块, ...
- 配置redis开机自启动和监听
redis安装好后,每次手动启动很不方便,配置开机自启动. 方法一:设置启动命令到/etc/rc.d/rc.local rc.local文件是系统全局脚本文件,会在其他开机进程脚本文件执行完毕后执行该 ...
随机推荐
- poj 1436 线段树
题意:给你N条线段(垂直于x轴)的两个y坐标还有x坐标,问相互看到的三元组有多少个.有点纠结就是,如果两个连线之间正好有一条线段的某个端点,这个也是不能计算的,所以这个端点就有意义了,所以就用上面那个 ...
- bzoj3173 Splay 维护前缀中的最大值
大致题意: 有一个空序列,依次插入1~N到该序列中,每次指定插入的位置,每次插入完成返回当前序列的LIS的长度. 题解: 设dp[i]表示 前缀1~i的最长上升子序列的长度. 因为是按照递增顺序插入的 ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- Codeforces Round #293 (Div. 2) C. Anya and Smartphone 数学题
C. Anya and Smartphone time limit per test 1 second memory limit per test 256 megabytes input standa ...
- h5的部分新元素或属性
#h5的新元素或属性 - datalist标签(新表单元素):规定了input元素可能的选项列表. * 条件:datalist的id属性值必须等于input元素的list属性值. ...
- Go语言Web框架gwk介绍 (四)
事件 gwk支持事件系统,但并没有硬编码有哪些事件,而是采用了比较松散的定义方式. 订阅事件有两种方式: 调用On函数或者OnFunc函数 func On(moudle, name string, h ...
- [Linux] tmux 终端复用命令行工具
tmux 终端复用命令行工具 tmux 是一款终端复用命令行工具,通常用于 Terminal 的窗口管理.可以在终端软件重启后通过命令行恢复上次的 session. 安装运行 macOS 上使用 Ho ...
- Selenium2+python自动化58-读取Excel数据(xlrd)
前言 当登录的账号有多个的时候,我们一般用excel存放测试数据,本节课介绍,python读取excel方法,并保存为字典格式. 一.环境准备 1.先安装xlrd模块,打开cmd,输入pip inst ...
- Maven实战(四)——基于Maven的持续集成实践
Martin的<持续集成> 相信非常多读者和我一样.最早接触到持续集成的概念是来自Martin的著名文章<持续集成>.该文最早公布于2000年9月,之后在2006年进行了一次修 ...
- sqlite3.exe 使用
1 下载sqlite3.exe 2 命令行cmd,进入到sqlite3.exe目录 3 >sqlite3.exe database.db 来打开sqlite数据库. 4 基本语法: > ...