个人对Redis pub/sub机制在实际运用场景的理解

10 篇文章 0 订阅

Redis 的pub/sub机制与23种设计模式中的观察者设计模式极为类似。但Redis对于这个机制的实现更为轻便和简结,没有观察者模式的那么复杂的逻辑考虑而仅仅需要通过两个Redis客户端配置channel即可实现,因此它也仅仅做了消息的"发布"和"订阅"的实现,而在实际处理这类场景时遇到的情况根本没有考虑到。

数据可靠性无法保证
一个redis-cli发布消息n个redis-cli接受消息。消息的发布是无状态的,即发布完消息后该redis-cli便在理会该消息是否被接受到,是否在传输过程中丢失,即对于发布者来说,消息是"即发即失"的.

扩展性太差

不能通过增加消费者来加快消耗发布者的写入的数据,如果发布者发布的消息很多,则数据阻塞在通道中已等待被消费着来消耗。阻塞时间越久,数据丢失的风险越大(网络或者服务器的一个不稳定就会导致数据的丢失)

资源消耗较高

在pub/sub中消息发布者不需要独占一个Redis的链接,而消费者则需要单独占用一个Redis的链接,在java中便不得独立出分出一个线程来处理消费者。这种场景一般对应这多个消费者,此时则有着过高的资源消耗。

对于如上的几种不足,如果在项目中需要考虑的话可以使用JMS来实现该功能。JMS提供了消息的持久化/耐久性等各种企业级的特性。如果依然想使用Redis来实现并做一些数据的持久化操作,则可以根据JMS的特性来通过Redis模拟出来.

  • subscribe端首先向一个Set集合中增加“订阅者ID”,此Set集合保存了“活跃订阅”者,订阅者ID标记每个唯一的订阅者,例如:sub:email,sub:web。此SET称为“活跃订阅者集合”
  • subcribe端开启订阅操作,并基于Redis创建一个以“订阅者ID”为KEY的LIST数据结构,此LIST中存储了所有的尚未消费的消息。此LIST称为“订阅者消息队列”
  • publish端:每发布一条消息之后,publish端都需要遍历“活跃订阅者集合”,并依次向每个“订阅者消息队列”尾部追加此次发布的消息。
  • 到此为止,我们可以基本保证,发布的每一条消息,都会持久保存在每个“订阅者消息队列”中。
  • subscribe端,每收到一个订阅消息,在消费之后,必须删除自己的“订阅者消息队列”头部的一条记录。
  • subscribe端启动时,如果发现自己的自己的“订阅者消息队列”有残存记录,那么将会首先消费这些记录,然后再去订阅。
  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Redis具有多种实际应用场景,包括但不限于以下几个方面: 1. 缓存:Redis最常见的用途就是作为缓存层,将经常访问的数据存储在内存中,以提高读取速度和减轻后端数据库的负载。通过使用Redis的高速读写能力,可以大幅提升系统的响应性能。 2. 话存储:Redis可以用作话存储,将用户的话数据存储在内存中,实现快速的话访问和管理。这对于需要处理大量并发用户请求的应用程序特别有用。 3. 消息队列:Redis支持发布-订阅模式(Pub/Sub),可以作为消息队列系统使用。通过将消息发布到特定的频道,不同的客户端可以订阅这些频道并接收实时的消息推送。这在实时通知、实时聊天和异步任务处理等场景中非常有用。 4. 计数器和排行榜:Redis提供了原子性操作和快速的计数功能,可用于实现计数器和排行榜功能。例如,在社交媒体应用中,可以使用Redis来实时统计用户的粉丝数量或文章的点赞数,并根据这些数据生成排行榜。 5. 地理位置服务:Redis的地理位置功能(Geo)可以存储和查询地理位置信息,如坐标和半径范围内的位置。这使得Redis在构建地理位置服务(如附近的人、门店定位等)时非常有用。 总之,Redis一个功能强大且灵活的内存数据库,可用于多种实际应用场景,包括缓存、话存储、消息队列、计数器和排行榜,以及地理位置服务等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值