Redis实现不可靠发布/订阅功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis实现不可靠发布/订阅功能相关的知识,希望对你有一定的参考价值。

参考技术A

Redis 通过 PUBLISH 、 SUBSCRIBE 等命令实现了订阅与发布模式, 这个功能提供两种信息机制, 分别是订阅/发布到频道和订阅/发布到模式, 本文讨论订阅/发布到频道的实现

如图展示了发布消息到 channel1 后,各个client都会接收到 message

虽然Redis能够实现发布/订阅的功能,但是有如下缺点,所以选用前需谨慎考虑

由于Redis发布/订阅模型存在的缺陷,所以使用前需要考虑如下几点

具体使用还是需要考虑业务场景需求

在目前SpringBoot使用Redis的操作中,官方推荐使用SpringData模块中的 spring-data-redis ,所以下文会以 spring-data-redis 进行

序列化使用的是 GenericJackson2JsonRedisSerializer ,使用这个类可以正确序列化Null的对象.如果使用 Jackson2JsonRedisSerializer ,会将对象序列号成空数组.

简单起见,在这里使用SpringSchedule,周期性发布消息

在订阅程序中,有两个比较重要的类,分别是 MessageListenerAdapter 和 RedisMessageListenerContainer
其中 MessageListenerAdapter 实现 MessageListener 作用是将自定义的消费类进行适配.这个类必须有一个 public 的消费方法,并且方法需要有两个参数,arg1为 channel ,arg2是 Message .原因可以在 MessageListenerAdapter 源码中发现

在 MessageListenerAdapter.onMessage 方法中,通过反射对消费类进行了方法调用,并且方法的参数和顺序进行了硬编码,所以必须在消费类中提供一个public方法

从官方文档中,可以得知 RedisMessageListenerContainer 的作用是用于接收消息后进行分发,并且通过内部的线程池进行异步分发,(也可以使用自定义的线程池和相关失败策略)

启动一个发布者,两个订阅者

以上是关于Redis实现不可靠发布/订阅功能的主要内容,如果未能解决你的问题,请参考以下文章

Redis发布订阅 -- 2019-08-11 19:47:44

PHP + Redis 订阅/发布 实现即时通讯功能

Redis实现中间件(订阅)

Laravel Redis 发布订阅消息

Redis发布订阅原理与实践

基于Redis发布订阅和websocket实现聊天室功能