企业IM比如企业微信、钉钉里面的群消息的有个已读未读的功能,发送者刚发出消息时,当前群里其他群成员都是未读状态,陆陆续续有人看了这个消息,这时候消息的详情变成x人已读,y人未读,该如何设计呢?每一条消息,已读未读详情其实就是一个0/1的标记而已,我们可以选择维护一个bitmap来实现。每个群的信息保存userid到自增mapid的**映射**,这样群成员每加入一个群里,就有mapid<->usreid的双向映射了。假如群里有5个成员ABCDE, 那就对应mapid 1-5,messageid对应的消息详情存储就可以设计成{ uint32_t maxid, uint8_t readbit[]}。如上面的案例就是{5, readbit[0] =bin(0000 0000)}; 就占用了5B(4+1)(4byte+8bit),A发消息,D已读消息时,就更新成{5,readbit[0]= bin(0000 1000)};其余4人都已读消息时,更新为{5, readbit[0]=bin(0001 1110)}。这是个粗略的方案,里面还有一些细节值得思考:1、退出的成员呢?比如C退出群,发消息时maxid还是5,已读+未读总人数应该是3(不包括发消息者本人),目前信息只有5个bit(0/1),识别不出来谁已经退出群聊了。2、退出群聊的成员如何处理?从GruopMetaInfo里面删除么?退出群聊成员重新加入又如何分配id呢? 2这个点,退出群聊的成员只能**逻辑删除**,不能物理删除,不然客户端展示已读未读详情时,通过mapid找不到对应的userid,退出的成员又重新加入群聊这个就好办了,把标记删除改成非标记删除,还是用旧的mapid。至于1呢?我目前想到比较好的方式就是再加多一个bitmap,记录成员在消息发送时是否已经退出群聊了,退出群聊就置为1,所以最终方案就是群信息增加userid,自增mapid双向映射,退出群聊成员标记删除,messageid已读未读详情存储 {maxid, readbit[], quitbit[]}新的方案带来怎样的收益呢?增加自增mapid字段,一个群聊维护一份,成本几乎可以忽略不计。每个成员已读未读由8B(64bit)优化成2bit,减少62/64, 200人已读未读旧的方案1600B, 现在只需要(200/8) * 2 + 4 = 54,每条消息节约95%+ 如果maxid如果到百万甚至千万级别,那岂不是灾难?一般实际场景,群聊是会限制人数的,就算不断踢人加新人,那maxid最多也只能到企业人数。如果maxid达到一个特别大数字,已读未读对应的存储可以增加多一个flag,如果bitmap存储成本远超过最初的方案,可以用最初的方案来实现,客户端提前埋好兼容逻辑就可以了。

关于消息未读和已读的学习相关推荐

  1. 微信的新消息一键标为已读.简单的微信脚本,使用autojs编写的安卓自动化脚本

    说明 本文提供的代码仅供参考.不建议用于生产环境. 可能有些地方在最新版本的Auto.js上面需要做修改,才能运行. Auto.js简介 Auto.js是利用安卓系统的"辅助功能" ...

  2. app里未读消息已读、未读是怎么设计的?

    也不知道大家目前都用的java编程软件有哪些,毕竟在应用程序中,未读和已读消息的设计取决于应用程序的需求和目标.下面是一些常见的设计模式: 一.简单的未读/已读标记 简单的未读/已读标记:这是最常见的 ...

  3. 踩坑记录:消息推送已读未读

    一.需求 最近工作中遇到了一个坑,在次记录一下. 社区管理员在后台发布一条社区公告,手机端该社区下的所有居民都可以收到这条公告,并且消息有已读未读状态. 二.分析 这个需求看起来很简单,无非就是后台发 ...

  4. android读信息会话,在融云 IMkit 会话界面基础上添加消息已读未读.

    在融云 IMkit 会话界面基础上添加消息已读未读. 使用过融云的同学们可能知道. 融云 IMkit 的会话界面, 发送玩消息后, 如果对方已读, 发送端则会显示小对号的图片. 但是更具需求要把小对号 ...

  5. Web聊天室消息[已读未读]的实现

    聊天室快速访问 继上次完成聊天室的历史记录功能后,我又想着实现聊天记录的已读未读功能.(轻喷..) 开始之前 首先我看了抖音和钉钉这两款应用的消息已读未读功能的呈现效果.首先是抖音,在聊天界面,给好友 ...

  6. od拦截消息 comboboxonchange_某聊天软件逆向之偷看消息不quot;已读quot;

    文章来源:网友投稿 0x00 适用场景 本文所采用技术,仅用来实现自定义功能,适用场景仅为自己两台电脑使用聊天软件互发消息学习研究使用. *本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果 ...

  7. 企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等

    本文作者潘唐磊,腾讯WXG(微信事业群)开发工程师,毕业于中山大学.内容有修订. 1.内容概述 本文总结了企业微信的IM消息系统架构设计,阐述了企业业务给IM架构设计带来的技术难点和挑战,以及技术方案 ...

  8. im即时通讯开发:消息模型、万人群、已读回执、消息撤回功能

    企业微信作为一款办公协同的产品,聊天消息收发是最基础的功能.消息系统的稳定性.可靠性.安全性尤其重要. 消息系统的构建与设计的过程中,面临着较多的难点.而且针对toB场景的消息系统,需要支持更为复杂的 ...

  9. #即时通讯#实现消息已读回执功能的思路与实现

    最近项目的聊天模块中增加了一个消息已读回执的功能,从技术上不是很难实现,但还是在这里记录一下,以便以后查阅. 所谓的消息已读回执,就是双方聊天时,如果对方看到了你新发的信息,这条消息在你这端就会标为& ...

最新文章

  1. JMX操作ActiveMQ(2)
  2. Esfog_UnityShader教程_前言
  3. outlook从服务器中恢复已删除项目,Exchange 恢复已删除项目
  4. Mybatis(三) 映射文件详解
  5. svn添加钩子hook
  6. 【Linux网络编程】并发服务器之多进程模型
  7. 【Linux】一步一步学Linux——tar命令(62)
  8. 计算机硬软件故障实训报告,计算机维护维修实训报告.docx
  9. 不同浏览器对URL最大长度的限制(转)
  10. (轉貼) 人人有功練!! 有功夫,沒懦夫 (News)
  11. 图书馆管理系统5W1H分析
  12. matlab几何形状面积计算,小学数学几何图形计算公式总结
  13. 2021-01-27
  14. 太阳直射点纬度计算公式_高中地理——每日精讲1题(地震、太阳高度角、极昼、昼夜长短)...
  15. 突然间电脑的复制粘贴不能用了???
  16. oracle dba_users,为什么dba_users里有的用户却总是select不出来
  17. 文献管理软件//Zotero的常用插件——Sci-hub/shortdoi批量下载、Zotfile重命名PDF文件及ZoteroQuickLook快速预览(二)
  18. android酷炫转圈动画,android常用旋转线条加载动画
  19. 基于随机森林的分类算法的matlab简单实现
  20. Win10 将D盘多余空间分配给C盘

热门文章

  1. ubuntu WPS升级后打不开
  2. jjjjjsssss
  3. 阿里云轻量应用服务器可以加数据盘吗?
  4. Python中字典的近亲——集合
  5. 网络编程及三大协议(TCP + UDP + Http)
  6. 2000年-2020年全球人口密度格点数据集(不同时间空间分辨率)
  7. 笛卡尔心形函数表达式_笛卡尔的心形图
  8. 5分钟了解微软、用友、阿里云、谷歌等本周新动态!
  9. java中块的作用是什么意思_java中finally块儿是怎么工作的?有什么意义?
  10. 在 Oracle 中新建 SDE 用户