redis发布(pub)、订阅(sub)模式
前言:redis提供了很多种功能或模式,可以运用在不同的场景下,今天记录下redis中的发布、订阅模式的基本使用
注redis安装及主从搭建请参考我其他博文http://www.cnblogs.com/longjee/p/8652374.html,本文不再赘述
- redis中的发布订阅由三部分组成。发布者(生产者)、通道(类似于topic)、订阅者(消费者),具体结构如下图:
- redis中实现发布订阅
- 首先我们打开两个客户端 A、B
- A客户端使用subscribe 命令订阅通道test
- 然后客户端B使用publish 命令发送消息
- 这个时候客户端A能自动接收到消息
- 至此,使用redis简单的搭建一个发布订阅服务就完成了。
- 使用Java基于redis实现发布订阅
- 首先我们新建一个maven的项目。然后建立三个属于该项目的module: redis-pub、redis-sub、redis-common
- 在redis-pubsub(下面简称父项目)的pom中添加jedis的依赖 ,本人使用2.9.0版本
- redis-common是我写的一个公共组件
- 下面开始写sub端(贴出部分为核心代码)
package com.star4j.redissub.client; import com.star4j.rediscommon.helper.JedisConnectionHelper;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub; /**
* @Author: WuYL
* @Description: 实现订阅功能
* @Date: Create in 2018/3/29 15:21
* @Modified By:
*/
public abstract class SubClient extends JedisPubSub{ private Jedis jedis = null; public SubClient(Jedis jedis){
this.jedis = jedis;
} protected SubClient(){
jedis = JedisConnectionHelper.get();
} /**
* 订阅一个通道 (必须实现该类才行)
* @param channal
*/
public final void sub(String channal){
jedis.subscribe(this, channal);
} /**
* 有消息被推送过来时调用(子类实现)
* @param channel
* @param message
*/
public abstract void message(String channel, String message); @Override
public void onMessage(String channel, String message) {
this.message(channel, message);
} }- pub端代码(部分代码)
package com.star4j.redispub.client; import com.star4j.rediscommon.helper.JedisConnectionHelper;
import redis.clients.jedis.Jedis; /**
* @Author: WuYL
* @Description: 发布端实现
* @Date: Create in 2018/3/29 15:41
* @Modified By:
*/
public class PubClient { /**
* 发布消息
* @param channel
* @param message
*/
public static void pub(String channel, String message){
Jedis jedis = JedisConnectionHelper.get();
jedis.publish(channel, message);
JedisConnectionHelper.close(jedis);
}
}- 测试:使用postman进行测试。结果如下。
至此,使用Java搭建一个简单的发布订阅模式已经完成!
如有什么不对之处,敬请指教。
上面为关键部分代码,完整代码请到我的github:https://github.com/wylsource/redis-pubsub
redis发布(pub)、订阅(sub)模式的更多相关文章
- 文成小盆友python-num12 Redis发布与订阅补充,python操作rabbitMQ
本篇主要内容: redis发布与订阅补充 python操作rabbitMQ 一,redis 发布与订阅补充 如下一个简单的监控模型,通过这个模式所有的收听者都能收听到一份数据. 用代码来实现一个red ...
- Redis——发布和订阅
发布与订阅(又称pub/sub),订阅者(listener)负责订阅频道(channel),发送者(publisher)负责向频道发送二进制字符串消息(binary string message).每 ...
- Redis - 发布和订阅
一.概述 1). 发布和订阅是一种消息通信模式. 2). 优点:使消息订阅者和消息发布者耦合度降低,类似设计模式中的观察者模式. 二.发布和订阅 订阅命令: // 订阅一个或多个频道 // 返回值:v ...
- redis发布与订阅
发布与订阅 除了实现任务队列外, Redis还提供了一组命令可以让开发者实现"发布/订阅"(publish/subscribe)模式. "发布/订阅"模式同样可 ...
- redis 发布和订阅实现
参考文献 15天玩转redis -- 第九篇 发布/订阅模式 <Redis设计与实现> 命令简介 在redis用户手册中,跟发布订阅相关的命令有如下的六个: PSUBSCRIBE PUBL ...
- redis 发布与订阅原理分析
前言:用了redis也有一段时间了,但是发布与订阅的使用频率也不高,趁着这次空闲,深究下redis的发布与订阅模式. 一.订阅频道和信息发布 功能说明:Redis 的 SUBSCRIBE 命令可以让客 ...
- Redis 发布与订阅 消息
基于Redis消息队列-实现短信服务化 1.Redis实现消息队列原理 常用的消息队列有RabbitMQ,ActiveMQ,个人觉得这种消息队列太大太重,本文介绍下基于Redis的轻量级消息队列服务. ...
- Redis 发布与订阅模式
subscribe 订阅 publish 发布 频道 发布内容
- 03 Redis发布与订阅
以qq群的公告,单个发布者,多个收听者为例 发布/订阅 实验 发布订阅的命令 PUBLISH channel msg 将信息 message 发送到指定的频道 channel SUBSCRIBE ch ...
- php swoft redis 发布和订阅
//订阅 public function subscribe() { /* @var \Swoft\Redis\Redis $redis */ $redis = App::getBean(\Swoft ...
随机推荐
- 洛谷 P 1018 乘积最大 ==Codevs
题目描述 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得 ...
- poj1190,DFS/已知一个等式,求另一个最小值
7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱. ...
- 用Google Analytics UTM标注社会化媒体分享流量来源
随着社会化媒体营销概念近两年的日益盛行,敢于吃螃蟹的营销工作者们展开了一些尝试,发现对社会化营销效果进行综合评估是一大难点,价值难以衡量.主要原因在于它的营销效果中混杂了直接的目标转化.品牌宣传.品牌 ...
- 没啥用,更换注册表信息使webbrower选择适合的版本
/// <summary> /// 修改注册表信息来兼容当前程序 /// /// </summary> ...
- POJ 3254 【状态压缩DP】
题意: 给一块n*m的田地,1代表肥沃,0代表贫瘠. 现在要求在肥沃的土地上种草,要求任何两个草都不能相邻. 问一共有多少种种草的方法. 种0棵草也是其中的一种方法. n和m都不大于12. 思路: 状 ...
- 为RAC私有网络配置网卡Bonding
在RAC的安装部署过程中.并不不过简单的安装完毕了事.整个安装过程要考虑可能出现的单点问题,当中比較重要的是私有网络. 私有网络是RAC节点间通信的通道.包含节点间的网络心跳信息.Cache fusi ...
- Office PDF如何旋转页面之后保存
直接视图-旋转视图-逆时针,是不行的,旋转之后无法保存,另存为之后也再打开也没有效果. 要点击视图-工具-页面 然后在右边的菜单中点击旋转,然后执行旋转,然后就可以保存了.
- Activity调用isDestroyed()方法报出,java.lang.NoSuchMethodError
在測试App的过程中,Activity调用了isDestroyed()方法,报出了java.lang.NoSuchMethodError错误. 自己手机MI 2S,版本号4.1.1. 事实上原因就是i ...
- vue 自定义 移动端筛选条件
1.创建组件 components/FilterBar/FilterBar.vue <template> <div class="filterbar" :styl ...
- #include<> 和 #include""的区别
#include< file >编译程序会先到标准函数库中找文件 #include”file” 编译程序会先从当前目录中找文件 参考原文 转: 在C程序中包含文件有以下两种方法: (1)用 ...