.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这种简单的发布/订阅机制实现消息的分发。