Redis的Keyspacenotifications功能初探(二)

2014-11-24 03:33:55 · 作者: · 浏览: 26
.getLog(MySubscribe.class); // 初始化按表达式的方式订阅时候的处理 public void onPSubscribe(String pattern, int subscribedChannels) { log.info(pattern + "=" + subscribedChannels); } // 取得按表达式的方式订阅的消息后的处理 public void onPMessage(String pattern, String channel, String message) { log.info(pattern + "=" + channel + "=" + message); } ...其他未用到的重写方法忽略 } 作为Jedis自定义订阅,必须继承redis.clients.jedis.JedisPubSub类,在psubscribe模式下,重点重写onPMessage方法,该方法为接收到模板订阅后处理事件的重要代码。pattern为在绑定订阅时使用的通配模板,channel为通配后符合条件的实际通道名称,message就不用多说了,就是事件消息内容。

3.实战

通过Redis自带的redis-cli命令,我们可以在服务端通过命令行的方式直接操作。我们运行上面的示例代码,然后迅速切换到redis-cli命令中,建立一个生命周期很短暂的数据:
127.0.0.1:6379> set chaijunkun 123 PX 100
PX参数指定生命周期单位为毫秒,100即声明周期,即100毫秒。key为chaijunkun的数据,其值为123。当执行语句后,回显:
OK

这时我们看实例程序的输出:
*=__keyevent@0__:expired=chaijunkun
从输出可以看出,之前指定的通配符为*,通配任何通道;之后是实际的通道名称:__keyevent@0__:expired,这里我们可以看到订阅收到了一个keyevent位于 数据库0,事件类型为:expired,是一个过期事件;最后是chaijunkun,这个是过期数据的key。在官方文档中,keyevent通道的格式永远是这样的: __keyevent@__:prefix
对于数据过期事件,我们在绑定订阅时通配模板也可以精确地写成: __keyevent@*__:expired
通过示例代码,我们可以看到确实印证了之前的构想,实现了数据过期的事件触发(event)或者说回调(callback)。

4.其他应用

之前的代码中,对于事件的发布都是由Redis自己生成的。实际上在命令中主动发布自定义消息也是可以的,在publish命令的帮助中我们看到:
127.0.0.1:6379> help publish

  PUBLISH channel message
  summary: Post a message to a channel
  since: 2.0.0
  group: pubsub

通过参数,可以自定义通道名称和通道消息。而在Jedis中,发布API甚至做到了字节数据的级别: jedis.publish(byte[] channel, byte[] message)
因此我们可以构想,自定一套通讯协议,channel为命令字,message为消息体,我们可以通过redis这种简单的发布/订阅机制实现消息的分发。