发布订阅模式
在之前的文章中先容了利用Redis列表这种数据类型来实现一个轻量级的行列步队,不过利用列表实现的行列步队存在一个毛病便是由于是基于列表实现,以是出行列步队之后则不再存在,以是只能被一个消费者消费一次,不支持多个不同的消费者各消费一次,即不支持广播。为了实现行列步队常见的发布订阅PubSub模式,在Redis中供应了的发布与订阅实现,即生产者客户端可以往某个指定的频道channel或者模式pattern发布一个,然后将这个广播给多个订阅了这个频道channel的客户端或者广播给订阅了该匹配的某个模式pattern的客户端。以是Redis供应的是的发布与订阅,不是传统的行列步队实现,发布的并不会被存储,如Redis基于列表实现的行列步队会在消费之前存放在列表的链表数据构造里。Redis供应的订阅发布是实时的发布和订阅吸收,如果所发往的频道channel或者模式pattern没有订阅者,则该条不会传给任何其他客户端,直接过掉或者说丢弃掉。轻量级实现
二、利用方法

基于Redis命令行利用
以下基于Redis的命令行对的订阅与发布功能进行演示,个中包含订阅频道channel和订阅模式pattern两种用法。1.订阅频道channel
1.如下首先在一个命令行订阅名为testChannel的频道,壅塞等待:
127.0.0.1:6379> SUBSCRIBE testChannelReading messages... (press Ctrl-C to quit)1) \"大众subscribe\"大众2) \"大众testChannel\"大众3) (integer) 1
2.然后在其余一个命令行往testChannel频道发布一个:
127.0.0.1:6379> PUBLISH testChannel \公众hello\公众(integer) 1
3.在之前的订阅命令行吸收到了这个发布的,并且连续壅塞等待:
127.0.0.1:6379> SUBSCRIBE testChannelReading messages... (press Ctrl-C to quit)1) \"大众subscribe\公众2) \"大众testChannel\"大众3) (integer) 11) \"大众message\"大众2) \"大众testChannel\"大众3) \公众hello\"大众
2.订阅模式pattern
订阅模式紧张是模糊匹配,如模式test 则匹配所有以test开头的模式和频道channel,即如果某个客户端订阅了模式 test,则当其余一个客户端往testChannel这个频道发布了一条或者往test 这个模式发布了一条,该客户端会收到,如下订阅test 这个模式pattern,然后利用上面的命令往testChannel这个频道发布一条hello,则该客户端会收到,如下:127.0.0.1:6379> PSUBSCRIBE testReading messages... (press Ctrl-C to quit)1) \"大众psubscribe\公众2) \公众test\"大众3) (integer) 11) \"大众pmessage\"大众2) \"大众test\"大众3) \"大众testChannel\"大众4) \"大众hello\"大众
基于Java客户端Jedis利用
在Java编程中,可以基于Redis的Java客户端Jedis来对订阅与发布功能进行利用,如果项目利用了spring-data-redis包供应的封装类来利用。以下利用Jedis进行一个大略演示:当发布到某个频道channel时,由于模式pattern是模糊匹配,以是如果存在与这个频道channel匹配的pattern,则订阅了这个pattern的客户端也会收到。由于Jedis的频道吸收subscribe和模式吸收psubscribe都是壅塞方法,以是只有一个会收到并在JedisPubSub方法的回调方法打印,以是在实际编程中,由于是壅塞方法,常日在不同的线程进行分别吸收。