Redis应用场景很多,现在介绍一下它的几大特性之一 发布订阅(pub/sub)
特性介绍:
什么是redis的发布订阅(pub/sub)? Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能。基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。熟悉设计模式的朋友应该了解这与23种设计模式中的观察者模式极为相似。
同样,Redis的pub/sub是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合, Redis作为一个pub/sub的server, 在订阅者和发布者之间起到了消息路由的功能。
上面的都是概念,不知道没关系,其实我也看不懂。
简单来讲,这里面还有个channel的概念,这里就是频道的意思,比如你订阅了银行的频道,当你的资金发生变动时,银行就会通过它的频道给你发送信息,在这里,你是属于被动接收的,而不是向银行索要信息,这个例子中,你就是sub(订阅者),而银行就是pub(发布者)。
代码:
先引入依赖
- <dependency>
- 2.9.0</version>
- </dependency>
新建一个发布者
- publicclassextends
- privatefinal
- public
- this.jedisPool = jedisPool;
- @Override
- publicvoid
- newnew
- //连接池中取出一个连接
- whiletrue) {
- null;
- try
- if"quit".equals(line)) {
- "mychannel", line); //从 mychannel 的频道上推送消息
- else
- break;
- catch
- }
新建一个订阅者
- publicclassextends
- public
- @Override
- publicvoid//收到消息会调用
- "receive redis published message, channel %s, message %s", channel, message));
- @Override
- publicvoidint//订阅了频道会调用
- "subscribe redis channel success, channel %s, subscribedChannels %d",
- @Override
- publicvoidint//取消订阅 会调用
- "unsubscribe redis channel, channel %s, subscribedChannels %d",
- }
订阅频道
- publicclassextends
- privatefinal
- privatefinalnew
- privatefinal"mychannel";
- public
- super("SubThread");
- this.jedisPool = jedisPool;
- @Override
- publicvoid
- "subscribe redis, channel %s, thread will be blocked", channel));
- null;
- try
- //取出一个连接
- //通过subscribe 的api去订阅,入参是订阅者和频道名
- catch
- "subsrcibe channel error, %s", e));
- finally
- ifnull) {
- }
测试下
- publicclass
- publicstaticvoid
- // 连接redis服务端
- newnew"172.31.12.18", 7379);
- "redis pool is starting, redis ip %s, redis port %d", "127.0.0.1", 7379));
- new//订阅者
- new//发布者
- }
打印信息