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

即时通讯未读消息计数

单聊未读消息计数

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

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

在线

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

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

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

离线

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

未读消息 的 key 设计

在这里插入图片描述

在这里插入图片描述

群聊未读消息计数

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

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

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

优化前

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

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

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

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

优化后

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

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

优化了哪里呢?

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

客户端行为的改变:

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

具体逻辑:

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

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

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

在这里插入图片描述

在这里插入图片描述

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

http://www.lryc.cn/news/464022.html

相关文章:

  • 在Openshift(K8S)上通过EMQX Operator部署Emqx集群
  • Python酷玩之旅_数据分析入门(matplotlib)
  • uiautomatorviewer安卓9以上正常使用及问题处理
  • Go语言gRPC快速入门
  • Golang | Leetcode Golang题解之第479题最大回文数乘积
  • UDP协议讲解
  • 交叉注意力融合时域、频域特征的FFT + CNN -BiLSTM-CrossAttention轴承故障识别模型
  • CSDN Markdown 编辑器语法大全
  • TCP/IP 协议【四次挥手】简要说明
  • 第11篇:网络安全协议
  • ES-入门-javaApi-文档-新增-删除
  • 【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b
  • 【MR开发】在Pico设备上接入MRTK3(三)——在Unity中运行MRTK示例
  • C#中委托的应用与示例
  • 算法: 模拟题目练习
  • 软考中级科目怎么选?软考中级证书有什么用?
  • HTTP 请求的请求体是什么
  • 助力语音技术发展,景联文科技提供语音数据采集服务
  • PyTorch搭建神经网络入门教程
  • 你的电脑能不能安装windows 11,用这个软件检测下就知道了
  • BF 算法
  • SHOW-O——一款结合多模态理解和生成的单一Transformer
  • 缓存框架JetCache源码解析-缓存变更通知机制
  • Android 设置特定Activity内容顶部显示在状态栏底部,也就是状态栏的下层 以及封装一个方法修改状态栏颜色
  • 用自己的数据集复现YOLOv5
  • 如何在博客中插入其他的博客链接(超简单)最新版
  • JS通过递归函数来剔除树结构特定节点
  • javayufa
  • 软考-高级系统分析师知识点-补充篇
  • JavaScript全面指南(四)