reids 发布订阅模型实践及Stream实践
1. pub/sub
redis支持发布订阅模型 订阅者订阅通道,发布者朝通道发布消息,订阅者从通道中接受消息。下面演示一个简单的案例:
消费者订阅通道 channelOne
生产者推送消息
消费者获取到信息
2. pub/sub Java代码实践
订阅者
package com.xzq;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
/**
* @Author xzq
* @Description //TODO
* @Date 2021/11/24 21:36
* @Version 1.0.0
**/
public class Provider {
private static Jedis jedis = new Jedis("127.0.0.1", 6379);
public static void main(String[] args) {
jedis.subscribe(new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
System.out.println("我接受到通道{" + channel + "}的消息:" + message);
}
}, "channelOne");
}
}
生产者向channelOne推送消息
消费者订阅消息
可以看到由上面的两个例子,订阅者一旦订阅将会处于阻塞状态,等待消息的推送。
但是pub/sub 的弊端也很明显,首先不支持持久化,如果客户端发生网络波动,找不到订阅者便丢失消息,所以客户端必须要先进行订阅。并且没有ACK机制,当客户端读取消息后发生了某些异常导致消息没有正常消费,但是redis的pub/sub机制 发完既丢,导致消息的不可靠性。
redis5.0推出了Stream 来解决消息的持久化问题,并增加了ACK反馈和主备复制功能。