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文件是系统全局脚本文件,会在其他开机进程脚本文件执行完毕后执行该 ...
随机推荐
- servlet生命周期和执行流程
一 .生命周期 servlet 声明周期可以分四个阶段: 类装载过程 init() 初始化过程 service() 服务过程,选择doGet \ doPost destroy() 销毁过程 servl ...
- poj 1062 昂贵的聘礼 最短路 dijkstra
#include <cstdio> #include <cmath> #include <cstring> #include <ctime> #incl ...
- 读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第三部分)
下面来谈谈书中的第二部分,用Interface Classes来降低编译的依赖.从上面也可以看出,避免重编的诀窍就是保持头文件(接口)不变化,而保持接口不变化的诀窍就是不在里面声明编译器需要知道大小的 ...
- Git_分支管理
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇宙合并 ...
- SVN服务端的版本对比及创建仓库时的注意事项
SVN是一个开放源代码的版本控制系统,分为客户端和服务端.就windows系统而言,客户端通常使用 TortoiseSVN,下载地址:https://tortoisesvn.net/ ,而服务端通常 ...
- WinPE作为启动硬盘
之前我一直是用UltraISO将U盘制作为启动盘,这种方式本身简单易用,但也有一些令人不爽的地方 每次都要重新格式化U盘, 本身WinPE并不大,只需要几百兆空间,一旦U盘在使用时,明明都有足够的空间 ...
- php 可以动态的new一个变量类名
<?PHPheader("content-type:text/html; charset=utf-8");//echo ucfirst('a b'); class Stude ...
- vc 6.0 远程调试
http://blog.sina.com.cn/s/blog_45eaa01a01014eb5.html
- FT网站开发过程遇到的问题汇总
1.jar包不兼容问题.主要是mybatis,spring jar包不兼容.同时jstl标签也需要jar包,是jstl.jar,standard.jar. 2.mybatis的mapper.xml映射 ...
- 【docker-compose】使用docker-compose部署运行spring boot+mysql 【处理容器的时区问题】【详解】【福利:使用docker-compose构建 wordpress+mysql】
==================================================================================================== ...