当前位置: 首页 > article >正文

即时通讯未读消息计数

单聊未读消息计数

未读消息的计数,分为两个部分:增加减少

其中,未读消息计数的增加,是由数据库(redis)在写入消息的同时,增加对应接收方的未读消息计数

在线

用户在线时,客户端会实时收到消息,未读消息计数的显示由客户端处理,服务端同时记录在数据库中

1.如果用户未打开对话窗口,则根据接收到的消息数量显示未读消息计数

2.如果用户打开对话窗口,则客户端向服务端发送未读消息计数清零的请求,窗口打开时,每收到一条消息发送一次清零请求(可优化)

离线

用户离线,再次上线后,客户端拉取未读消息计数,并显示给用户。上线以后就是在线状态的逻辑了

未读消息 的 key 设计

在这里插入图片描述

在这里插入图片描述

群聊未读消息计数

群聊的难点在于,一个人发送一条消息,要确保所有人的未读消息计数增加,这带来写扩散的压力

但是,必须增加每个人的未读消息计数吗

不是的,未读消息计数是客户端上线后拉取的,只要保证客户端能正确获取到未读消息计数就行

优化前

服务端维护每个群聊成员的未读群消息计数,就像单聊一样

每有一条群聊消息,增加所有人的未读消息计数(如果1个人发1条消息,千人群要操作1000次redis,很快会达到redis写能力瓶颈)

客户端直接拉取对应用户的群聊未读消息计数

客户端在线时,用户若已读消息,客户端要向服务端请求清零消息未读计数,逻辑同单聊

优化后

服务端不再维护每个群聊成员的群消息未读计数,而是记录整个群聊的消息总数,和每个群成员的已读消息数量

客户端拉取未读消息计数时,服务端返回 消息总数 - 已读消息数量

优化了哪里呢?

解决了写扩散的问题,一个人发消息,只会进行一次写操作(消息总数+1),而不是1000次(增加每个人的未读计数)

客户端行为的改变:

客户端请求清零消息未读计数 —> 客户端上报用户已读消息数量

具体逻辑:

1.用户打开群聊消息窗口,则已读消息数量 += 读前的未读消息数量

2.用户一直打开消息窗口,客户端每收到一条消息,请求增加一次已读消息数量

群聊消息总数 和 用户已读消息数 的 key 设计

在这里插入图片描述

在这里插入图片描述

点击获取更多Linux C/C++开发学习资料


http://www.kler.cn/news/356573.html

相关文章:

  • 计算机网络基础进阶
  • git基础操作步骤
  • 【Linux系列】在 Linux 中使用 `watch` 命令监控 Docker 容器状态
  • 从0-1实战演练后台管理系统 (2)从零开始:Pure Admin 环境搭建完全指南,小白也能轻松掌握!
  • 前端vue-登录页面中密码登录和验证码登录的实现步骤
  • C#中 is 和 as 运算符使用与区别
  • Scrapy | Scrapy框架中管道的使用
  • 计算机挑战赛6
  • 多ip访问多网站
  • VScode打开代码显示乱码
  • Git小知识:合理的分支命名约定
  • LLMS-大语言模型和ai的关系?
  • 常用AI工具
  • C++ Socket通讯连接Server,并可设置连接超时时间
  • Android从上帝视角来看PackageManagerService
  • 洛谷 P4995:跳跳! ← 贪心算法
  • 编程大师都选择的Mustache 一个高效的Java库
  • linux中安装和使用dos2unix
  • (30)数字信号处理中的时域分析:均值、方差、与功率
  • 力扣 中等 82.删除排序链表中的重复元素 II