欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Redis 订阅发布_Jedis实现方法

程序员文章站 2023-12-13 10:33:04
我想到使用redis的订阅发布模式是用来解决推送问题的~。 对于概念性的叙述,多多少少还是要提一下的: 什么是redis发布订阅?redis发布订阅是一种消息通信模式,...

我想到使用redis的订阅发布模式是用来解决推送问题的~。

对于概念性的叙述,多多少少还是要提一下的:

什么是redis发布订阅?redis发布订阅是一种消息通信模式,发送者通过通道a发送消息message,订阅过通道a的客户端就可以接收到消息message。嗯度娘上面的解释要比我所说的好多了,而我所理解的就是:所谓的订阅发布模式,其实和我们看电视,听广播差不多,在我们没有调台(换频道)的时候,那个频道也是在传递消息的(发布)。我们换到那个频道上(订阅)就能接收到消息了。是的,虽然可能有些不恰当~

说明

本文中示例采用了三个客户端,以“品”字形排列,由上至下,由左至右分别为客户端1(c1),客户端2(c2),客户端3(c3).特此说明。

redis订阅与发布命令

首先声明,有关redis服务器的搭建工作,请自行查阅相关资料进行环境抢建

听说redis中发布与订阅只有简单的6个命令。即:

psubscribe pattern [pattern ...]

订阅一个或者多个符合pattern格式的频道

publish channel message

发布消息到chanel中

pubsub subcommand [argument [argument ...]]

查看订阅与发布系统状态

punsubscribe [pattern [pattern ...]]

退订所有符合格式的频道

subscribe channel [channel ...]

订阅一个或者多个频道

unsubscribe [channel [channel ...]]

取消订阅频道

例1 - subscribe

连接redis后键入命令

subscribe study

这样便订阅了一个名为study的频道。

接下来study频道要发消息啦。~~

例2 - publish

另开启一个客户端,我使用的是品字形布局的最上面那个做为发布者,键入

publish study "message1-go go go"

可以看到,当客户端1在study频道发布消息时,客户端2(已订阅study频道)可以接收到c1发布的消息,而客户端3由于没有订阅study频道,所以接收不到c1发送的消息。

例3 - psubscribe

现在,跟着博主左手,右手一个慢动作。在c3中键入

psubscribe study*

ok,现在在c1中键入

publish study "message2"

上结果图:

c3采用的通配符的形式,也将study频道给订阅成功了。

接下来,在c1中继续键入命令:

publish study:java "i hate java forever"

可以看到,使用psubscribe不仅将study频道订阅了,而且将以study为首的频道也订阅了。

例4 - pubsub

在c1中键入pubsub channel,可以获得:

127.0.0.1:6379> pubsub channels

1) "study"

意为当前正在活跃的频道。

jedis实现订阅发布者模式

好了,上面通过命令行熟悉了一下redis中有关订阅发布者模式的相关命令。下面我们要将redis的订阅与发布者嵌入到项目中。

首先,我们使用jedis先订阅一个名为:study的频道

然后我们先从命令行处进行消息发布:

之后 ,我们使用jedis在项目中进行消息发布:

我们可以进行正常的通信 ~噢耶~

核心代码:

publishmessage.java 用于开启一个发布消息的线程

private logger logger = loggerfactory.getlogger(publishmessage.class);

@resource
private jediscluster jediscluster;

/**
 * 发布消息
 *
 * @param channel 频道
 * @param message 信息
 */
public void sendmessage(final string channel, final string message) {
  thread thread = new thread(() -> {
    long publish = jediscluster.publish(channel, message);
    logger.info("服务器在: {} 频道发布消息{} - {}", channel, message, publish);
  });
  logger.info("发布线程启动:");
  thread.setname("publishthread");
  thread.start();
}

chatsubscribe.java用于处理订阅相关事件,继承自jedispubsub

private logger logger = loggerfactory.getlogger(chatsubscribe.class);

// 取得订阅的消息后的处理
@override
public void onmessage(string channel, string message) {
  logger.info("订阅成功,接收到的消息为:频道-{},消息-{}", channel, message);
  redisstring.message = message;
}

// 取得按表达式的方式订阅的消息后的处理
@override
public void onpmessage(string pattern, string channel, string message) {
  system.out.println("-----取得按表达式的方式订阅的消息后的处理-----");
  system.out.println(pattern + "=" + channel + "=" + message);
}

// 初始化按表达式的方式订阅时候的处理
@override
public void onpsubscribe(string pattern, int subscribedchannels) {
  system.out.println("-----初始化按表达式的方式订阅时候的处理-----");
  system.out.println(pattern + "=" + subscribedchannels);
}

// 取消按表达式的方式订阅时候的处理
@override
public void onpunsubscribe(string pattern, int subscribedchannels) {
  system.out.println("-----取消按表达式的方式订阅时候的处理-----");
  system.out.println(pattern + "=" + subscribedchannels);
}

@override
public void onpong(string pattern) {
  super.onpong(pattern);
}

// 初始化订阅时候的处理
@override
public void onsubscribe(string channel, int subscribedchannels) {
  logger.info("初始化订阅信息:频道-{},订阅频道-{}", channel, subscribedchannels);
}

// 取消订阅时候的处理
@override
public void onunsubscribe(string channel, int subscribedchannels) {
  logger.info("已取消订阅频道{}", channel);
}

subscribemessage.java 订阅频道,取消频道等动作类

private logger logger = loggerfactory.getlogger(subscribemessage.class);

private executorservice cachedthreadpool = executors.newcachedthreadpool();

@resource
private jediscluster jediscluster;
/**
   * 订阅频道
   *
   * @param channel     频道
   * @param roomsublisterner
   */
  public void subscribechannel(final string channel, final chatsubscribe roomsublisterner) {

    cachedthreadpool.execute(new runnable() {
      @override
      public void run() {
        jediscluster.subscribe(roomsublisterner, channel);
      }
    });
  }

jediscluster是否封装工具类,取自各位看官,核心代码已给出,请各位看官根据自身业务与逻辑,自行更改与优化代码。

本次示例程序采用tomcat 9.0 + spring + springmvc

使用了诸如:@restcontroller,@getmapping等相关注解,便于开发,有兴趣可自行查阅spring相关资料。

以上这篇redis 订阅发布_jedis实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

上一篇:

下一篇: