im群组消息推送方案之"redis"实现

二尸兄 2016-09-08 04:30:29

im群组消息推送方案之"redis"实现
火狐打开webqq登陆后,打开控制台看到 一条轮训post请求;由此做出以下推测方案来实现同样效果:

1、第一种:
新消息进入 -->
每个人都有一个hash key以uid为key 个人信息为key-value键值对(包括自己所加的所有群组的gid) -->
新消息发到哪个组就插入到哪个群组下(组的消息用 有序集合(组名gid为key 消息json做value元素))-->

新消息读取 -->
每个人都在轮训读取各自 uid key下的个人信息;拿到自己所加的所有群组的gid -->
轮训查询所有群下的新消息;
第一次拿到每个群下的最新10条数据;记录下每个群拿到10条后的位置存放在个人信息key下
大于第二次 读取群消息时从刚保存的位置开始读取;(有序集合可以做到)


2、第二种:
新消息进入 (一个json包) -->
为每一条新消息 生成一个自增id 加入json包->
每个人都有一个hash key以uid为key 个人信息为key-value键值对(包括自己所加的所有群组的gid) -->
消息发到哪个组就插入到哪个组下(组的消息用 有序集合(组名gid为key 消息json为value))-->

新消息读取 -->
每个人都在轮训读取各自 uid key下的个人信息;拿到自己所加的所有群组的gid -->
轮训查询所有群下的新消息;
以后的每次,都取每个群下的最新10条数据; 重复消息由客户端去判断去重


3、 第三种:
新消息进入(一个json包)-->
为每一条新消息 生成一个自增id 加入json包->
每个人都有一个hash key以uid为key 个人信息为key-value键值对(包括自己所加的所有群组的gid) -->
每个人都有一个消息队列(list)以new_message_uid为key -->
将新消息解析分析是插入到那个群组gid(gid有序集合类型以群组gid为key 以新消息为元素) -->
新消息json 需要插入两次以上 一次是发到群组gid 作为历史消息 一次是发给那个群的所有成员(只发在线的人)-->

新消息读取 -->
每个人都只需要轮训读取自己的消息队列

历史记录读取-->单独开一条请求去 有序集合类型gid为key 以新消息为元素 那个key中去取

判断用户的在线状态打算利用 redis-> 127.0.0.1>zrangebyscore myzset time()-300 time() withscores

求指点以上方案可行性,以及更好的解决方案...
...全文
412 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧