Redis 发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的 channel。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
Redis 发布订阅命令
SUBSCRIBE channel [channel …]
订阅一个或多个 channel
1 | 127.0.0.1:6380> SUBSCRIBE testChannel |
UNSUBSCRIBE [channel [channel …]]
退订一个或多个 channel
PSUBSCRIBE pattern [pattern …]
订阅所有匹配一个或多个 pattern 的 channel
PUNSUBSCRIBE [pattern [pattern …]]
退订所有匹配一个或多个 pattern 的 channel
PUBLISH channel message
发布消息到指定的 channel
1 | # 打开一个新的控制台发布消息到 testChannel |
PUBSUB subcommand [argument [argument …]]
查看订阅与发布系统状态。
1 | 127.0.0.1:6380> PUBSUB channels |
Java 实现 Redis 发布订阅
JavaApi 向 channel 发送消息可以直接调用 Jedis 的 publish(final String channel, final String message) 方法。订阅 channel 则需要调用 Jedis 的 subscribe(final JedisPubSub jedisPubSub, final String… channels)方法,并实现 JedisPubSub 类的 onMessage() 方法来处理消息。
Jedis 的 subscribe() 方法中调用了 JedisPubSub 的 proceed()方法,proceed()方法中订阅 channels 并调用了 process() 方法。process() 方法会一直循环调用 onMessage() 方法处理消息。所以使用 subscribe() 方法时,一般开启新的线程进行订阅,要不然 subscribe() 方法后面的代码不会执行。
下面是 JedisPubSub proceed()方法和 process() 方法的实现:
1 | public void proceed(Client client, String... channels) { |
下面是一个简单的实现发布的订阅模式的代码,github地址:PubsubDemo.java
1 | public class PubsubDemo { |