本篇将向大家介绍怎么通过redis来实现订阅和发布功能
首先介绍一下实现功能的主要几个命令:
- SUBSCRIBE 命令,这个命令可以让我们订阅任意数量的频道
- PUBLISH 命令,此命令是用来发布消息
- PSUBSCRIBE命令,此命令用来支持模糊订阅的功能
在展示具体的demo之前,我们先简单了解下这其中的原理:
在redisServer结构中的其中一个属性pubsub_channels是用来记录channel和客户端之间的关系,是使用key–>List的数据格式。如图:
在我们使用SUBSCRIBE 命令在客户端client10086订阅了channel1 channel2,channel3
订阅:
SUBSCRIBE channel1 channel2,channel3
这时pubsub_channels的数据将会变为,如图:
这就可以看出来执行SUBSCRIBE 命令就是将客户端信息添加到对应的channel对应列表的尾部。
模式订阅:
模式订阅设计到redisServer的另一个属性pubsub_patterns,也是一个链表,里面存储着客户端订阅的所有模式。结构如下图:
当客户端订阅了一个模式,此时结构变为:
发布:
PUBLISH 命令发布消息将消息推送到对应的客户端
在执行PUBLISH 命令发布消息的时候,首先会在pubsub_channels上找到对应的channel,遍历其中所有的client信息,将消息发送到所有client;同时也会在pubsub_patterns上遍历找到匹配的模式,发给对应的客户端
取消订阅:
UNSUBSCRIBE命令取消对应客户端的订阅
当执行UNSUBSCRIBE命令时则将对应的client从channel列表中移除
具体demo如下:
首先我们创建两个客户端执行体:
package com.example.redisdemo.service;
import redis.clients.jedis.JedisPubSub;
/**
* 订阅消息消费体.
* @author yzlu
*/
public class OneJedisPubSub extends JedisPubSub {
//接收到消息时执行
@Override
public void onMessage(String channel, String message){
System.out.println("oneJedisPubSub message is" + message);
}
//接收到模式消息时执行
@Override
public void onPMessage(String pattern, String channel, String