首页 > 编程知识 正文

redis发布订阅持久化,redis如何实现发布订阅

时间:2023-05-04 23:50:35 阅读:178244 作者:2150

本文源代码为3359 github.com/Duk TIG 666/learn-example/tree/5586 febea 31 C2 FB 368e 19 FB DBA 11e d 08 AFD 463 e0/redis/src/tree/5586

Redis发布订阅概述Redis发布订阅是一种消息通信模型,其中始发者(pub )发送消息,订阅者(sub )接收消息。

Redis客户端可以订阅任意数量的通道。

介绍:

PUBLISH命令向通道发送信息。 此客户端被称为publisher发布者。 SUBSCRIBE通过称为subscriber订阅者的命令通道订阅信息。 在redis中,订阅模块名为PubSub,即PublisherSubscriber。单个发布者可以向一个信道发送消息,订阅者可以向多个信道订阅消息发布者向频道发布消息后,如果订阅者订阅了频道,订阅者将收到消息。发布订阅相关的命令

命令说明Redis Unsubscribe命令意味着取消指定的通道。 Redis Subscribe命令订阅指定的一个或多个频道的信息。 Redis Pubsub命令显示订阅和发布系统的状态。 Redis Punsubscribe命令取消保留所有指定模式的通道。 Redis Publish命令将信息发送到指定的通道。 Redis Psubscribe命令订阅与指定模式匹配的一个或多个通道。 订阅演示subscribe/publish

psubscribe/publish

将Redis发布订阅模型与消息中间件进行比较的可靠性Redis可以实现发布订阅,其功能与一般的消息中间件相似,只是Redis的发布订阅模式不支持持久化

另一方面,RabbitMQ具有消息消耗确认机制,呼叫者在消息消耗之前一直排队。

实时性Redis作为一种高效的缓存服务器,不需要对基于内存的、发布的消息进行持久化,具有更高的实时性。

消费者负载均衡rabbitmq队列可以由多个消费者同时监控消费,但每条消息只能消费一次。 由于rabbitmq的消费确认机制,可以根据消费者的消费能力调整负荷;

redis发布订阅模式允许多个消费者同时订阅一个队列,当消息到达时,它会依次将该消息发送给每个读者。

持久性redis:redis持久性是针对整个redis缓存的,有两种持久性方法: RDB和aof (redis持久性方法,后续更新),用于将整个redis实例持久性化到磁盘

rabbitmq:队列、消息都可以选择性持久化,持久化粒度更小、更灵活;

队列监控rabbitmq实现了后台监控平台,可以看到通过该平台创建的所有队列的详细情况,良好的后台管理平台在方面我们可以更好地使用;redis没有所谓的监控平台

总结redis:重量轻、低延迟、高合并、低可靠性;

rabbitmq:重量级、高可靠性、异步、不保证实时;

rabbitmq是专用的AMQP协议队列,具有提供可靠的队列服务和异步感知的优点。 而redis主要用于缓存,redis的发布订阅模块用于实现及时、不可靠的功能。

SpringBoot集成Redis实现了发布订阅模型SpringBoot集成Redis的缺省配置。 有关详细信息,请参阅本文的相关来源。

1、定义订阅者接收消息的接口

目的:统一接收方法,便于以后配置适配器

@ componentpublicinterfaceredismsg {/* * * redis订阅者接收消息的接口* * @param message订阅的消息*/voidreceivemessage (stoid ) 2、定义两个读者

publicclassredischannelsubimplementsredismsg { @ overridepublicvoidreceivemessage (string message ) /信道调用的方法名称为, 与RedisPubSubConfig的监听器适配器的消息适配器参数2相同的System.out.println (这必须是redischannelsub'----- )

lic class RedisPmpSub implements RedisMsg { /** * 接收消息的方法 * * @param message 订阅消息 */ @Override public void receiveMessage(String message) { //注意通道调用的方法名要和RedisConfig2的listenerAdapter的MessageListenerAdapter参数2相同 System.out.println("这是RedisPmpSub---" + message); }}

3、定义订阅相关配置

@Configurationpublic class RedisPubSubConfig { /** * Redis消息监听器容器 * * @param connectionFactory / * @return / */ @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); //订阅了一个叫pmp和channel 的通道,多通道 container.addMessageListener(listenerAdapter(new RedisPmpSub()), new PatternTopic("pmp")); container.addMessageListener(listenerAdapter(new RedisChannelSub()), new PatternTopic("channel")); //这个container 可以添加多个 messageListener return container; } /** * 配置消息接收处理类 * * @param redisMsg 自定义消息接收类 * @return Redis的监听适配器 */ @Bean @Scope("prototype") MessageListenerAdapter listenerAdapter(RedisMsg redisMsg) { //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器,利用反射的方法调用“receiveMessage” //也有好几个重载方法,这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看 //注意2个通道调用的方法都要为receiveMessage return new MessageListenerAdapter(redisMsg, "receiveMessage"); }}

4、定义发布者

这里使用定时发布(当然也可以根据业务情况触发消息的发布,比如使用接口触发)

@EnableScheduling@Componentpublic class TestScheduleRedisPublishController { @Autowired private StringRedisTemplate stringRedisTemplate; /** * 向redis消息队列index通道发布消息 */ @Scheduled(fixedRate = 2000) public void sendMessage() { stringRedisTemplate.convertAndSend("pmp", String.valueOf(Math.random())); stringRedisTemplate.convertAndSend("channel", String.valueOf(Math.random())); }}

5、启动程序后的结果

可以看到两个订阅者,都可以正常的接收消息。

参看 springboot入门–springboot集成redis实现消息发布订阅模式-双通道redis发布订阅模式redis发布订阅模式用做消息队列和rabbitmq的区别

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。