多个客户端在互相发送和接收消息的时候,通常会使用以下两种方式来传递消息。第一种时消息推送,也就是由消息发送者来确保所有接受者已经成功接收到了消息,Redis内置了PUBLISH和SUBSCRIBE命令可以实现;第二种时消息拉取,这种方法要求接收者自己去获取存储在某种mailbox里的消息。尽管消息推送非常有用,但是客户端因为某些原因而没办法一直保持在线的时候,采用这一消息传递方法的程序就会出现各种各样的问题。本章节将尝试编写不同的消息拉取方式,来替代PUBLISH和SUBSCRIBE。
单接收者消息的发送与订阅替代品
假设现在打算开发一个移动通信程序,这个应用通过连接服务器来发送和接受雷系短信或彩信的消息,基本上就是一个文字短信和图片彩信的替代品。每条消息都只会被发送至一个客户端,这一点极大地简化了我们要解决的问题。可以为每个移动客户端使用一个列表结构,发送者会把消息放到接受者的列表中,而接受者客户端则通过发送请求来获取最新的消息。数据格式如下:
- key
- mailbox:bboyjing
- list value
- “{“sendder”:”dora”,”msg”:”Hi I’m dora.”}”
- ××××××
该示例的代码实现比较简单,之前也已经学过如何对列表进行推入和弹出操作,这里就不再给出代码实现了。
多接受者消息的发送与订阅替代品
单个接受者的消息传递已经满足不了需求,现在要实现一个群组聊天功能,和之前一样,因为应用程序的客户端可能会载人和时候进行连接或者断开连接,所以还是不能使用内置的PUBLISH和SUBSCRIBE。
每个新创建的群组都会有一些初始用户,每个用户都可以按照自己的意愿来参加或者离开群组。群组使用有序集合来记录参加群组的用户,其中有序集合的成员为用户的名字,分值时用户在群组内接收到的最大消息ID。用户也会使用有序集合来记录自己参加的所有群组,其中有序集合的成员为群组ID,分值是用户在群组内接收到的最大消息ID。数据格式如下:
- key
- chat:001
- zset value
- member : john | score : 5
- member : jeff | score : 6
- key
- chat:002
- zset value
- member : michelle | score : 10
- member : jason | score : 10
- member : jenny | score : 11
- key
- member:jason
- zset value
- member : 001 | score : 5
- member : 002 | score : 6
- key
- member:jeff
- zset value
- member : 001 | score : 6
以上数据例子表示jason和jeff都参加了001群组,其中用户jason看了6条群组消息中的5条。
创建群组聊天会话
|
|
发送消息
|
|
获取消息
|
|
加入群组和离开群组
加入和离开群组只需要初始化或者删除一些数据,比较简单,就不给出例子了。