搜索
首页Javajava教程什么是Redis发布订阅?

什么是Redis发布订阅?

Jun 20, 2017 am 09:56 AM
jedisredis发布实现订阅

我想到使用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发布订阅?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案?如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案?Mar 17, 2025 pm 05:46 PM

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)?如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存?如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存?Mar 17, 2025 pm 05:44 PM

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射?如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射?Mar 17, 2025 pm 05:43 PM

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

Java的类负载机制如何起作用,包括不同的类载荷及其委托模型?Java的类负载机制如何起作用,包括不同的类载荷及其委托模型?Mar 17, 2025 pm 05:35 PM

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具