Redis消息拉取

本文介绍了消息传递中的两种主要方法:消息推送与消息拉取,并详细解释了如何利用Redis实现单个接收者及多个接收者场景下的消息传递。对于单个接收者场景,使用列表结构存储消息,接收者可以通过HTTP1.1或WebSocket获取未读消息。对于多个接收者场景,如群聊,文章提供了使用字符串、有序集合等数据结构的具体方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个或多个客户端在互相发送和接收消息的时候,通常会使用以下两种方法来传递消息。第一种方法被称为消息推送(push messaging),也就是由发送者来确保所有接收者已经成功接收到了消息。Redis内置了用于进行消息推送的PUSLISH命令和SUBSCRIBE命令,尽管消息推送非常有用,但是当客户端因为某些原因而没办法一直保持在线的时候,采用这一消息传递方法的程序就会出现各种各样的问题。第二种方法被称为消息拉取(pull messaging),这种方法要求接收者自己去获取在某种邮箱(mailbox)里面的消息。

单个接收者

只有单个接收者的消息传递操作和前面介绍过的先进先出的队列有很多共通之处,每条消息都只会被发送至一个客户端,为了以这种方法来处理消息,我们将为每个移动客户端使用一个列表结构,发送者会把消息放到接收者的列表里面,而接收者客户端则通过发送请求来获取最新的消息,通过使用HTTP 1.1协议的流水线请求特性或者新型的Web套接字功能,移动客户端既可以在一次请求里面获取所有未读消息,又可以每次请求只获取一条未读消息,还可以通过使用LTRIM命令移除列表的前10个元素来获取最新的10条未读消息。

多个接收者

多个接收者的情况类似于聊天群组,即群组内的人发消息,其他人都可以收到。我们可以使用以下几个数据结构存储所需数据,以便实现我们的所需的功能:

  1. STRING: 群组的消息自增id,INCR实现id自增并获取;
  2. ZSET: 存储该群组中的每一条信息,分值为当前群组内的消息自增id,ZRANGEBYSCORE实现获得未获取的消息;
  3. ZSET: 存储该群组中每个人获得的最新一条消息的id ,所有消息均未获取时为0,ZCARD实现获取群组人数;ZRANGE经过处理后,可实现哪些消息成功被哪些人接收了的功能;ZRANGE:获取id最小数据,可实现删除被所有人获取过的消息的功能;
  4. ZSET: 存储一个人所有群组获得的最新一条消息的id ,离开群组时自动删除,加入群组时初始化为0,ZCARD获取所在的群组个数;ZRANGE经过处理后,可实现批量拉取所有群组的未获取的消息的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值