现网程序运行一段时间后,经常发现收不到redis订阅消息。输入client list查询redis连接信息,输出如下信息:
id=2375018 addr=120.15.207.135:9159 fd=663 name=subarea age=3324 idle=563 flags=N db=0 sub=0 psub=1 multi=-1 qbuf=0 qbuf-free=0 obl=16382 oll=797 omem=12734654 events=rw cmd=psubscribe
其中两个关键字段 idle=563 连接空闲563s,按理说不可能空闲,因为对端在不停发消息。继续查看 omem=12734654,输入缓冲区内存占用竟然达到12G。服务器内存被耗尽,不再向客户端发布消息。
看看redis.conf配置项:
client-output-buffer-limit pubsub 32mb 8mb 60 #当缓冲区数据达到硬限制32M时,连接会关闭;当缓冲区数据达到软限制每60秒8M时,连接也会关闭。 client-output-buffer-limit pubsub 0 0 0 #可将hard limit和soft limit同时置0,关闭该限制。该操作官方不推荐。
经排查发现上述问题是由于关闭了订阅/发布输出缓冲区内存限制,程序操作阻塞,没有及时取走发布的消息,导致消息在服务端不断缓存,最终耗尽服务端内存,客户端无法接收到订阅消息。
解决方案: 将订阅消息读取到本地队列中,防止阻塞订阅消息的读取;单独启动一线程扫描队列消息即可。
相关推荐
在这一模式下,Redis服务器作为消息的中间人,允许多个客户端(订阅者)订阅特定的主题,当有发布者向该主题发布消息时,所有订阅了该主题的客户端都会收到消息。这种模式提供了一种轻量级的通信方式,适合实时通知...
- **订阅者必须在线**:订阅者只有在连接到Redis服务器时才能接收到消息,一旦断开连接,就无法接收到在此期间发布的消息。 - **消息的顺序性**:Redis不保证消息的顺序性,订阅者可能按照不同的顺序接收到消息。 ...
5. **WebSocket消息推送**:WebSocket服务器收到Redis的消息后,将其转发给已连接的客户端。 6. **前端实现**:前端使用WebSocket API建立连接,订阅WebSocket服务器的事件,接收到消息后更新UI展示任务状态。 **...
当消息发布后,所有订阅了"myChannel"的客户端(包括这个示例中的`subscriber`)都会收到并打印出消息。 此外,Redis的发布订阅功能还支持通配符订阅,例如`*`代表任意字符,`#`代表零个或多个任意字符。这使得我们...
发布/订阅是Redis的一个重要特性,它允许应用程序以广播消息的方式进行通信,订阅者可以监听特定频道并接收发送到该频道的消息。以下是一个简单的.NET Core 3.0应用,展示了如何使用StackExchange.Redis创建发布者和...
这个项目可能包含了启动 Redis 客户端,订阅频道,以及处理收到的订阅消息的示例。 2. **SMSForm** 和 **OrderForm**:这两个文件名暗示了可能有两个不同的应用场景,比如 SMSForm 可能是处理短信通知的界面或服务...
当数据库中的数据发生变化时,可以通过发布消息到特定的频道,然后所有订阅该频道的客户端都会收到这个消息,并据此更新自己的数据缓存。 使用C#与Redis交互时,首先需要安装StackExchange.Redis NuGet包。以下是一...
发布订阅模式允许消息生产者(Publisher)发送消息到特定的频道(Channel),而多个消息消费者(Subscriber)可以订阅这些频道,一旦有新消息发布,所有订阅了该频道的消费者都会收到通知。这种模式实现了点对多的...
`uTerminalFrm`可能是一个用户界面,用于显示和交互Redis操作,如发布消息、订阅频道等。`.ddp`是Delphi工程的项目文件,`.dfm`包含表单的布局信息,而`.pas`则包含对应的源代码。 3. NsyRedis.dof 和 RedisClient....
此外,Redis 还提供了发布/订阅(pub/sub)模式,允许多个客户端订阅特定的主题,当有新的消息发布到该主题时,所有订阅者都会收到通知。这种模式非常适合构建实时消息系统。 在这个“websocket-redis长连接订阅...
如何做到多节点缓存同步呢,可使用redis消息队列广播功能,使用Redis订阅一个主题,注册监听,当有数据变更的时候往这个主题发布一个消息,集群中的各个节点都会收到这个消息执行本地缓存的更新操作。
然后,设计实现Redis发布订阅功能过程,如图1所示,包括建立发布者Publisher类、订阅者Subscriber类和消息监听类。 三、实现Redis发布订阅功能的步骤 1. 建立发布者Publisher类,通过频道(mychannel)发布消息。 ...
6. **发布/订阅**:Redis的pub/sub(发布/订阅)模式可以实现消息传递,让多个客户端订阅同一个主题,当有新消息发布时,所有订阅者都能收到。 接下来,我们讨论RedisDesktop工具的使用: 1. **界面友好**:Redis...
在Redis中,发布/订阅(Publish/Subscribe,简称Pub/Sub)是一种消息通信模式,它允许消息生产者(发布者)发送消息到一个频道,而多个消息消费者(订阅者)可以实时接收这些消息。这个功能在分布式系统中尤其有用,...
Redis的发布/订阅(Publish/Subscribe)功能是其核心特性之一,它允许消息从一个源头广播到多个接收者,这种模式常被用于实时消息传递、通知系统或者构建解耦的组件。发布订阅在设计模式中可以类比为观察者模式,它...
在消息传递场景中,Redis的发布/订阅(pub/sub)模式特别有用,允许多个订阅者监听特定频道,一旦有消息发布到该频道,所有订阅者都会收到通知。 MQ redis测试工具就是为了解决开发者在测试这些系统集成时的痛点。...
5. **发布/订阅**:Redis 的 Pub/Sub(发布/订阅)模型允许客户端订阅特定频道,当有消息发布到这些频道时,所有订阅者都会收到消息,适合实现消息通知和异步通信。 6. **Lua 脚本**:Redis 支持内嵌 Lua 脚本执行...
- **发布/订阅(Pub/Sub)模式**:Redis提供了简单的消息发布订阅功能,允许一个或多个客户端订阅特定的频道,当有其他客户端向该频道发布消息时,所有订阅者都会收到消息。这种模式适用于广播消息,但不具备消息...
`publish`方法用于发布消息到指定频道,所有订阅该频道的客户端都会收到消息。这样,就可以实现实时的多对多通信场景,例如聊天室或通知系统。 在实际应用中,为了保证连接的稳定性和数据的完整性,`QRedis`类可能...
10. **发布/订阅功能**:Redis的发布订阅(pub/sub)模式允许消息传递,订阅者可以订阅特定的频道,当有消息发布到这些频道时,订阅者将收到通知。这是一种有效的异步通信机制。 11. **内存管理**:Redis主要在内存...