Java端实现RedisPUB/SUB(订阅发布)

    • 一准备
    • 二代码
    • 三成果
    • 四声明

一.准备

1.1 - 自行下载jedis jar包.
用maven的话

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

1.2 - 打开 redis 服务器待命.

二.代码

1/3.
先打开
SUB端:

package example.me.PubSub;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;

public class MySub {

    public static void main(String[] args) {

        final String host = "127.0.0.1";// Redis服务所在地址

        final int port = 6379;          // 主机端口

        @SuppressWarnings("resource")
        Jedis subJedis = new Jedis(host, port);

        JedisPubSub jedissubSub = new JedisPubSub() {

            public void onUnsubscribe(String channel, int num) {
            }

            public void onSubscribe(String channel, int num) {
            }

            public void onMessage(String channel, String msg) {
                System.out.println(channel + " : " + msg);
            }

            public void onPUnsubscribe(String channel, int num) {
            }

            /*
             * num 订阅数量
             */
            public void onPSubscribe(String channel, int num) {
            }

            /*
             * channel0订阅的channel正则表达式
             * channel 匹配上该正则channel值
             * msg 收到的消息
             */
            public void onPMessage(String channel0, String channel, String msg) {
            }

        };

        /*
         * 启动订阅,当该方法启动时,将阻塞等待消息
         * 说明:
         * 1.subscribe(JedisPubSub jedisPubSub, String... channels)
         *    是常规订阅方法,channel值基于完全匹配,方法中channels是多个要订阅的channel值
         * 2.psubscribe(JedisPubSub jedisPubSub, String... patterns)
         *    是正则订阅方法,channel值基于正则匹配,方法中的patterns是多个订阅到正则表达式
         *    不同的订阅将会触发JedisPubSub中不同的方法
         */
        subJedis.subscribe(jedissubSub, "news", "tvshow");//完全匹配
    }

}

2/3.
PUB端:

package example.me.PubSub;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class MyPub {

    public static void main(String[] args) {

        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxIdle(5);
        poolConfig.setMinIdle(1);
        poolConfig.setMaxWaitMillis(30000);

        JedisPool jedisPool = new JedisPool(poolConfig,"localhost", 6379, 100);

        Jedis pubJedis = jedisPool.getResource();

        try{
        pubJedis.publish("news", "Hello,MySubs~ ");//发送广播

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            jedisPool.returnResource(pubJedis);
            jedisPool.close();
        }

    }

}

3/3.
同时我们在 redis-cli 端也订阅相同channel:

三.成果

jedis-SUB端:

redis-cli端:

四.声明

4.1 - 本篇仅作为基础,还有很多功能未展现.
4.2 - Redis-Clients-Officialsite已有很多十分优秀的开源项目供参考.

参考资料:https://redis.io/clients
本文原文地址:http://blog.csdn.net/timo1160139211
小可不才,恭听指正.

时间: 2024-08-03 17:28:29

Java端实现RedisPUB/SUB(订阅发布)的相关文章

[WSE]Web Service—后台侦听服务通过WSE2.0建立订阅/发布关系

web|后台 由于Web Service的执行身份受限,所以我们无法直接让Web Service申请作为一个SoapReceiver,而是通过下面的web.config定义来制定本虚拟目录的.ashx终结点,从而通过WS_Addressing和WS_Messaging机制来完成与后台侦听服务之间的订阅/发布机制. <configuration> <configSections>     <section name="microsoft.web.services&qu

Android利用LocalSocket实现Java端进程与C端进程之间的IPC

Android是建立在Linux之上的OS,在涉及到安全.网络协议.文件加密等功能时,往往需要通过C语言调用底层API来实现,而如何发出指令让C端执行我们想要的功能,并且在执行之后有返回结果呢,这就需要打通Java端进程和C端进程,使之能高效地通信.这样,C端进程用于实现功能,Java端进程负责UI.功能的触发及结果处理就可以了. 对于*nix系统来说,"一切皆为文件",Socket也不例外,Socket按照收发双方的媒介来说有三种类型:1,通过网络端口:2,通过文件系统:3,通过内存

在JAVA端使Oracle存储过程串行地执行

我们知道给资源上锁可以使我们串行化地访问资源,oracle为plsql开发人员提供了DBMS_SQL包用来管理USERL LOCK锁资源.这种锁可以使得多个session串行的执行某个存储过程,还可以用来排他的访问某个外部设备或服务,甚至可以检测事务的提交或回滚(提交或回滚时锁的释放). 有人说我在java端调用db的存储过程,可以使用synchronized lock来串行的调用存储过程.那就不需要db lock呢?因为当java端应用服务器down的时候,存储过程已经在执行了,但是可能ora

[WSE]Web Service与Windows Service通过WSE2.0建立订阅/发布关系[更新版]

[WSE]Web Service与Windows Service通过WSE2.0建立订阅/发布关系   编写者:郑昀@UltraPower 编写日期:2005-04-13 修改日期:2005-05 目的: 我们建立这种交互关系的目的是,在Web Service和Windows Service(或者其他Windows应用)之间建立起一种稳固的可扩展的不受地域限制的交互关系.  优点: 这种交互关系的优点是: 完全异步: Web service和Windows service/windows for

Java端和js端cookie跨域共享

问题描述 Java端和js端cookie跨域共享 关于cookie共享技术,查了网上的资料,有两种方式:后台服务端和前台js端. 我在网站A后台服务端设置cookie如下: Cookie cookie = new Cookie("mobile", "*****"); cookie.setPath("/"); cookie.setDomain("cms.ban.net"); response.addCookie(cookie);

服务器-sql2008建订阅发布老是提示路径无效,但是实际是有这个路径呀!!

问题描述 sql2008建订阅发布老是提示路径无效,但是实际是有这个路径呀!! SQL Server 无法将"xx"配置为分发服务器. 执行 Transact-SQL 语句或批处理时发生了异常. (Microsoft.SqlServer.ConnectionInfo) 目标路径 D:Program FilesMicrosoft SQL ServerMSSQL10_50.QXHOUSEDBTEST1MSSQLData 无效. 无法列出目录内容.请指定有效的目标路径. 已将数据库上下文更改

flex java-在flex和java web工程交互时无法调用到JAVA端的方法

问题描述 在flex和java web工程交互时无法调用到JAVA端的方法 刚接触这方面,开始做helloWord实验就出错了,所以不可能是JAVA代码的问题:Flex界面能显示正常,但调用不了JAVA类.remoting增加了destination,Flex和JAVA整合环境按网上教程配置的,工具是Myeclipse6.5,Flex3.麻烦知道的大神指点下,感激不尽

echarts-ECharts可以不走JS直接在JAVA端生成图片吗?

问题描述 ECharts可以不走JS直接在JAVA端生成图片吗? 直接通过JAVA代码.不走前端JS,.直接生成一张图片可以吗. 解决方案 这个应该不可以,你试一下就知道了 解决方案二: 用jfreechart代替ECharts 解决方案三: 这个不行就换个试试,不用非得用它,实现了同样的效果就可以了 解决方案四: 不行.echarts是个js框架,怎么可能不走js呢

关于WMB.7实现订阅发布?

问题描述 初学WebSphere要做一个简单的小例子用WMB实现订阅发布,我自己做的这个例子调不出来.或者谁能提供我一个万分感谢: 解决方案 本帖最后由 wm_java 于 2011-11-11 15:51:20 编辑解决方案二:--SETOutputLocalEnvironment.Destination.MQDestionData[1].queueManagerName='MB7QMGR';--SETOutputLocalEnvironment.Destination.MQDestionDa