全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Redis 订阅发布_Jedis实现方法

我想到使用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实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# redis实现发布订阅  # redis发布订阅Java代码实现过程解析  # redis发布订阅_动力节点Java学院整理  # redis发布和订阅_动力节点Java学院整理  # Redis发布订阅和实现.NET客户端详解  # 浅谈我是如何用redis做实时订阅推送的  # 客户端  # 多个  # 给大家  # 可以看到  # 相关资料  # 命令行  # 的是  # 是在  # 是一种  # 好了  # 就能  # 退订  # 我们可以  # 也将  # 希望能  # 采用了  # 有兴趣  # 我所  # 要比  # 分别为 


相关文章: 企业网站制作公司网页,推荐几家专业的天津网站制作公司?  如何用美橙互联一键搭建多站合一网站?  金*站制作公司有哪些,金华教育集团官网?  宝塔建站后网页无法访问如何解决?  如何零基础开发自助建站系统?完整教程解析  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  javascript中对象的定义、使用以及对象和原型链操作小结  如何在万网主机上快速搭建网站?  如何快速查询域名建站关键信息?  如何通过WDCP绑定主域名及创建子域名站点?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  中山网站推广排名,中山信息港登录入口?  ,网站推广常用方法?  为什么Go需要go mod文件_Go go mod文件作用说明  利用JavaScript实现拖拽改变元素大小  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  网站制作说明怎么写,简述网页设计的流程并说明原因?  代购小票制作网站有哪些,购物小票的简要说明?  如何选择PHP开源工具快速搭建网站?  焦点电影公司作品,电影焦点结局是什么?  如何快速选择适合个人网站的云服务器配置?  如何选择高效稳定的ISP建站解决方案?  网站制作免费,什么网站能看正片电影?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  ,怎么在广州志愿者网站注册?  如何在云主机上快速搭建多站点网站?  建站主机与虚拟主机有何区别?如何选择最优方案?  南平网站制作公司,2025年南平市事业单位报名时间?  开心动漫网站制作软件下载,十分开心动画为何停播?  招贴海报怎么做,什么是海报招贴?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  如何选择适配移动端的WAP自助建站平台?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  如何在IIS7中新建站点?详细步骤解析  如何用免费手机建站系统零基础打造专业网站?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  建站之星导航配置指南:自助建站与SEO优化全解析  如何确保FTP站点访问权限与数据传输安全?  如何在建站主机中优化服务器配置?  如何用wdcp快速搭建高效网站?  网站制作的步骤包括,正确网址格式怎么写?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  如何快速生成专业多端适配建站电话?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  建站主机数据库如何配置才能提升网站性能? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。