Redis Pubsub命令用法
一.什么是pub/sub及实现
Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能。
Redis通过publish和subscribe命令实现订阅和发布的功能。
订阅者通过subscribe向redis server订阅自己感兴趣的消息类型。redis将信息类型称为通道(channel)。
当发布者通过publish命令向redis server发送特定类型的信息时,订阅该消息类型的全部订阅者都会收到此消息。
客户端1订阅CCTV1:
127.0.0.1:6379> subscribe CCTV1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "CCTV1"
3) (integer) 1
客户端2订阅CCTV1和CCTV2:
127.0.0.1:6379> subscribe CCTV1 CCTV2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "CCTV1"
3) (integer) 1
1) "subscribe"
2) "CCTV2"
3) (integer) 2
此时这两个客户端分别监听指定的频道。现在另一个客户端向服务器推送了这两个频道的信息。
127.0.0.1:6379> publish CCTV1 "cctv1 is good"
(integer) 2 //返回2表示两个客户端接收了该消息。
被接收到消息的客户端如下所示。
客户端1:
1) "message"
2) "CCTV1"
3) "cctv1 is good"
客户端2:
1) "message"
2) "CCTV1"
3) "cctv1 is good"
如上的订阅/发布也称订阅发布到频道(使用publish与subscribe命令),此外还有订阅发布到模式(使用psubscribe来订阅一个模式)
订阅CCTV的全部频道
127.0.0.1:6379> psubscribe CCTV*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "CCTV*"
3) (integer) 1
当依然先如上推送一个CCTV1的消息时,该客户端正常接收。
二、Pub/Sub在Java中的实现
导入Redis驱动:
dependencies {
compile 'redis.clients:jedis:2.4.2'
}
Redis驱动包提供了一个抽象类:JedisPubSub…继承这个类就完成了对客户端对订阅的监听。示例代码:
package com.ljq.durian.test; import org.apache.log4j.Logger; import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub; /**
* 客户端订阅监听类
*
* @author jqlin
*
*/
public class PubSubService extends JedisPubSub {
private static final Logger logger = Logger.getLogger(PubSubService.class); /**
* 监听到订阅频道接收到消息
*/
@Override
public void onMessage(String channel, String message) {
logger.info(String.format("onSubscribe: channel[%s], " + "message[%s]", channel, message));
} /**
* 监听到订阅模式接收到消息
*/
@Override
public void onPMessage(String pattern, String channel, String message) {
logger.info(String.format("onPMessage: pattern[%s], channel[%s], message[%s]", pattern, channel, message));
} /**
* 订阅频道时的回调
*
*/
@Override
public void onSubscribe(String channel, int subscribedChannels) {
logger.info(String.format("onSubscribe: channel[%s], " + "subscribedChannels[%s]", channel, subscribedChannels));
} /**
* 取消订阅频道时的回调
*/
@Override
public void onUnsubscribe(String channel, int subscribedChannels) {
logger.info(String.format("onUnsubscribe: channel[%s], " + "subscribedChannels[%s]", channel, subscribedChannels));
} /**
* 取消订阅模式时的回调
*/
@Override
public void onPUnsubscribe(String pattern, int subscribedChannels) {
logger.info(String.format("onPUnsubscribe: pattern[%s], " + "subscribedChannels[%s]", pattern, subscribedChannels));
} /**
* 订阅频道模式时的回调
*/
@Override
public void onPSubscribe(String pattern, int subscribedChannels) {
logger.info(String.format("onPSubscribe: pattern[%s], " + "subscribedChannels[%s]", pattern, subscribedChannels));
} public static void main(String[] args) {
Jedis jedis = null;
try {
jedis = new Jedis("127.0.0.1", 6379, 0);// redis服务地址和端口号
PubSubService pubSub = new PubSubService();
jedis.subscribe(pubSub, "news.share", "news.blog"); } catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
jedis.disconnect();
}
}
}
}
从代码中我们不难看出,我们声明的一个redis链接在设置监听后就可以执行一些操作,例如发布消息,订阅消息等。。。
当运行上述代码后会在控制台输出:
onSubscribe: channel[news.share],subscribedChannels[1]
onSubscribe: channel[news.blog],subscribedChannels[2]
//onSubscribe方法成功运行
此时当在有客户端向new.share或者new.blog通道publish消息时,onMessage方法即可被相应。(jedis.publish(channel, message))。
Redis Pubsub命令用法的更多相关文章
- Redis(四)--- Redis的命令参考
1.简述 数据类型也称数据对象,包含字符串对象(string).列表对象(list).哈希对象(hash).集合对象(set).有序集合对象(zset). 2.String数据类型命令 string ...
- 数据库 【redis】 命令大全
以下纯属搬砖,我用Python抓取的redis命令列表页内容 如果想看命令的具体使用可查去官网查看,以下整理为个人查找方便而已 地理位置GEOADD 将指定的地理空间位置(纬度.经度.名称)添加到指定 ...
- Redis Scan命令
原地址:https://www.cnblogs.com/tekkaman/p/4887293.html [Redis Scan命令] SCAN cursor [MATCH pattern] [COUN ...
- 【命令】Redis常用命令整理
doc 环境下使用命令: keys 命令 ? 匹配一个字符 * 匹配任意个(包括0个)字符 [] 匹配括号间的任一个字符, ...
- Redis常用命令整理
doc 环境下使用命令: keys 命令 ? 匹配一个字符 * 匹配任意个(包括0个)字符 [] 匹配括号间的任一个字符, ...
- redis 的命令总结
此博客为技术收集和个人的学习积累,如侵犯了您的权益,请联系我,我会及时删除,谢谢 [Redis] redis-cli 命令总结 Redis提供了丰富的命令(command)对数据库和各种数据类型进行操 ...
- redis scan 命令指南
redis scan 命令指南 1. 模糊查询键值 redis 中模糊查询key有 keys,scan等,一下是一些具体用法. -- 命令用法:keys [pattern] keys name* -- ...
- redis键命令
1.ping命令用于检测redis是否启动 成功返回pong表示链接成功 2.在远程redis服务上执行命令 Redis-cli -h host -p port -a password 如果是连接本机 ...
- Redis常用命令
Redis常用命令Redis提供了丰富的命令对数据库和各种数据类型进行操作,这些命令可以再Linux终端使用.1.键值相关命令2.服务器相关命令 一.键值相关命令 1.get get 键值 当 key ...
随机推荐
- springboot 文件上传大小配置
转自:https://blog.csdn.net/shi0299/article/details/69525848 springboot上传文件大小的配置有两种,一种是设置在配置文件里只有两行代码,一 ...
- 前端----css的继承性和层叠性
css有两大特性; 继承性和层叠性 继承性 继承:给父级设置一些属性,子级继承了父级的该属性, 这就是我们的css中的继承, 需要注意的是 有一些属性是可以继承下来的: color , font ...
- Python 三种过滤去重方法
SET集合去重 set(1,1,2) REDIS去重 布隆过滤器
- 并发性能的隐形杀手之伪共享(false sharing)
在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...
- IntellJ IDEA下写JUnit
安装配置JUnit File->Settings->Plugins->Browse Repositories->在右侧搜索框输入"junit"-> ...
- git使用中出现的错误
因同时有两个git账户,之前登录了git A 用户在使用了 1. 长期存储密码 git config --global credential.helper store 之后在git B 账 ...
- day07 元组类型 字典类型 集合
元组:元组就是一个不可变的列表 1.用途:当我们需要记录多个同种属性的值,并且只有读的需求,没有改的需求,应该用元组. 2.定义方式:在()内用逗号分隔开多个任意类型的元素 t=(‘egon’)#注意 ...
- export default 和 export 区别
转载:https://www.cnblogs.com/mengfangui/p/9073459.html 1.export与export default均可用于导出常量.函数.文件.模块等2.在一 ...
- jQuery 选择器demo练习
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...
- C++ Primer 笔记——lambda表达式
1.一个lambda表达式表示一个可调用的代码单元,可以理解为一个未命名的内联函数,但是与函数不同,lambda表达式可能定义在函数内部.其形式如下: [capture list] (paramete ...