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
求指点以上方案可行性,以及更好的解决方案...