Redis——发布和订阅

1、什么是发布订阅

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

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

2、Redis的发布和订阅

1、客户端可以订阅频道如下图

 2、当给这个频道发布消息后,消息就会发送给订阅的客户端

 

3、发布订阅的实现

  1. 打开一个客户端订阅channel1

        SUBSCRIBE channel1

 2、打开另一个客户端,给channel1发布消息hello

返回的(integer) 2 表示有两个订阅者

 3、打开第一个客户端可以看到发送的消息

 注:发布的消息没有持久化,如果在订阅的客户端收不到hello,只能收到订阅后发布的消息

关于我的项目中,为什么异步通知不使用Redis的发布订阅模式:

比如:Pub 和 sub 是两个线程。(甚至分别有多个线程,高并发环境)

现在最容易出现的问题就是 ——消息丢失。

使用Redis缓存行情数据,发现程序运行一段时间后,出现subscribe线程不再能够接收到订阅的行情数据,发现是由Redis的输出缓冲机制导致的。

Redis为了解决输出缓冲区消息大量堆积的隐患,设置了一些保护机制,主要采用两种限制措施:

  • 大小限制,当某一客户端缓冲区超过设定值后直接关闭连接;
  • 持续性限制,当某一客户端缓冲区持续一段时间占用过大空间时关闭连接。

对于Pub/Sub客户端(也就是发布/订阅模式),大小限制是8M,当输出缓冲区超过8M时,会关闭连接。持续性限制是,当客户端缓冲区大小持续60秒超过2M,则关闭客户端连接; 

建议:如果订阅的消息接收时间间隔短并且数据量过大的情况下,还是不要用这种方式了,如果发布者发送消息过快,而且在这一时刻数据量很大,那么会存在数据丢失问题。

网上给了一种设置缓冲区大小的设置,可以参考一下。

  1. client-output-buffer-limit pubsub 32mb 8mb 60   #当缓冲区数据达到硬限制32M时,连接会关闭;当缓冲区数据达到软限制每60秒8M时,连接也会关闭。  
  2. client-output-buffer-limit pubsub 0 0 0         #可将hard limit和soft limit同时置0,关闭该限制。该操作官方不推荐。 

解决方案:

可以编写一个定时删除的程序,但最好是用MQ去解决,关于MQ ,另见MQ 消息丢失处理的内容。

 


版权声明:本文为Alex_cf原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。