即时通讯未读消息计数
单聊未读消息计数
未读消息的计数,分为两个部分:增加和减少
其中,未读消息计数的增加,是由数据库(redis)在写入消息的同时,增加对应接收方的未读消息计数
在线
用户在线时,客户端会实时收到消息,未读消息计数的显示由客户端处理,服务端同时记录在数据库中
1.如果用户未打开对话窗口,则根据接收到的消息数量显示未读消息计数
2.如果用户打开对话窗口,则客户端向服务端发送未读消息计数清零的请求,窗口打开时,每收到一条消息发送一次清零请求(可优化)
离线
用户离线,再次上线后,客户端拉取未读消息计数,并显示给用户。上线以后就是在线状态的逻辑了
未读消息 的 key 设计


群聊未读消息计数
群聊的难点在于,一个人发送一条消息,要确保所有人的未读消息计数增加,这带来写扩散的压力
但是,必须增加每个人的未读消息计数吗
不是的,未读消息计数是客户端上线后拉取的,只要保证客户端能正确获取到未读消息计数就行
优化前
服务端维护每个群聊成员的未读群消息计数,就像单聊一样
每有一条群聊消息,增加所有人的未读消息计数(如果1个人发1条消息,千人群要操作1000次redis,很快会达到redis写能力瓶颈)
客户端直接拉取对应用户的群聊未读消息计数
客户端在线时,用户若已读消息,客户端要向服务端请求清零消息未读计数,逻辑同单聊
优化后
服务端不再维护每个群聊成员的群消息未读计数,而是记录整个群聊的消息总数,和每个群成员的已读消息数量
客户端拉取未读消息计数时,服务端返回 消息总数 - 已读消息数量
优化了哪里呢?
解决了写扩散的问题,一个人发消息,只会进行一次写操作(消息总数+1),而不是1000次(增加每个人的未读计数)
客户端行为的改变:
客户端请求清零消息未读计数 —> 客户端上报用户已读消息数量
具体逻辑:
1.用户打开群聊消息窗口,则已读消息数量 += 读前的未读消息数量
2.用户一直打开消息窗口,客户端每收到一条消息,请求增加一次已读消息数量
群聊消息总数 和 用户已读消息数 的 key 设计


点击获取更多Linux C/C++开发学习资料
相关文章:
即时通讯未读消息计数
单聊未读消息计数 未读消息的计数,分为两个部分:增加和减少 其中,未读消息计数的增加,是由数据库(redis)在写入消息的同时,增加对应接收方的未读消息计数 在线 用户在线时,客户端…...
在Openshift(K8S)上通过EMQX Operator部署Emqx集群
EMQX Operator 简介 EMQX Broker/Enterprise 是一个云原生的 MQTT 消息中间件。 我们提供了 EMQX Kubernetes Operator 来帮助您在 Kubernetes 的环境上快速创建和管理 EMQX Broker/Enterprise 集群。 它可以大大简化部署和管理 EMQX 集群的流程,对于管理和配置的知…...
Python酷玩之旅_数据分析入门(matplotlib)
导览 前言matplotlib入门1. 简介1.1 Pairwise data1.2 Statistical distributions1.3 Gridded data1.4 Irregularly gridded data1.5 3D and volumetric data 2. 实践2.1 安装2.2 示例 结语系列回顾 前言 翻看日历,今年的日子已划到了2024年10月19日,今天…...
uiautomatorviewer安卓9以上正常使用及问题处理
一、安卓9以上使用uiautomatorviewer问题现象 打开Unexpected error while obtaining UI hierarchy 问题详情 Unexpected error while obtaining UI hierarchy java.lang.reflect.InvocationTargetException 二、问题处理 需要的是替换对应D:\software\android-sdk-windows…...
Go语言gRPC快速入门
文章目录 前言gRPC是什么Go语言的gRPC技术栈准备工作接口定义代码生成服务端代码编写客户端代码编写效果演示完整代码链接最后 前言 你好,我是醉墨居士,这篇博客想帮助初学者能够快速入门gRPC,希望能够为你节省宝贵的时间,让时间…...
Golang | Leetcode Golang题解之第479题最大回文数乘积
题目: 题解: func largestPalindrome(n int) int {if n 1 {return 9}upper : int(math.Pow10(n)) - 1for left : upper; ; left-- { // 枚举回文数的左半部分p : leftfor x : left; x > 0; x / 10 {p p*10 x%10 // 翻转左半部分到其自身末尾&…...
UDP协议讲解
预备知识: 端口号port: 我们在正常网络通信时,实际上是进程在互相通信。 我们所有的网络通信的行为,本质上都是进程间通信。 对双方而言,1.先保证数据能到达自己的机器 ip解决 2.找到指定的进程 端口号 ip地址用来…...
交叉注意力融合时域、频域特征的FFT + CNN -BiLSTM-CrossAttention轴承故障识别模型
往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…...
CSDN Markdown 编辑器语法大全
Markdown 是一种轻量级标记语言,它以简洁、易读易写的特点,被广泛应用于技术文档、博客文章、笔记等领域。CSDN 的 Markdown 编辑器为用户提供了丰富的功能,让用户能够轻松地创建格式规范、内容丰富的文档。以下是一份详细的 CSDN Markdown 编…...
TCP/IP 协议【四次挥手】简要说明
四次挥手是为了确保数据的完整性和可靠性,解决的主要问题是双方在断开连接时,可能还有未完成传输的数据或者未被接收的数据。 具体来说,四次挥手解决的问题是: 第一次挥手(发送方向接收方发送FIN包)&#…...
第11篇:网络安全协议
目录 引言 11.1 安全套接字层(SSL)和传输层安全(TLS)协议 11.1.1 SSL/TLS 的工作原理 11.1.2 SSL/TLS 的应用场景 11.2 虚拟专用网(VPN)和 IP 安全协议(IPSec) 11.2.1 VPN 的工…...
ES-入门-javaApi-文档-新增-删除
新增指定索引的文档数据的代码如下: package com.atgulgu.es.test;import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.HttpHost; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexRe…...
【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b
【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b CogVideoX-2b 模型介绍发布时间模型测试生成的demo视频生成视频限制 运行环境安装运行模型下载开源协议参考 CogVideoX-2b 模型介绍 CogVideoX是 清影 同源的开源版本视频生成模型。 基础信息: 发布时间 2…...
【MR开发】在Pico设备上接入MRTK3(三)——在Unity中运行MRTK示例
在前面的文档中,介绍了如何在Unity工程中配置号MRTK和Pico SDK 【MR开发】在Pico设备上接入MRTK3(一)在Unity中导入MRTK3依赖【MR开发】在Pico设备上接入MRTK3(二)在Unity中配置Pico SDK 本文将介绍如何运行一个简单…...
C#中委托的应用与示例
委托 委托是指把事情托付给别人或别的机构办理。在C#语言中委托是一种特殊类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。委托是具有特定参数列表和返回类型的方法的引用的类型(不是引用对象,而是引用方法)。 可以委托将看作一个包含有序方法列表…...
算法: 模拟题目练习
文章目录 模拟替换所有的问号提莫攻击Z 字形变换外观数列数青蛙 总结 模拟 替换所有的问号 按照题目的要求写代码即可~ public String modifyString(String ss) {int n ss.length();if (n 1) {return "a";}char[] s ss.toCharArray();for (int i 0; i < n; i…...
软考中级科目怎么选?软考中级证书有什么用?
❇有计算机背景: 建议选择软件设计师或网络工程师。软件设计师更适合软件工程专业的同学报考,而网络工程师更适合网络工程专业的朋友(仅供参考)。 ❇没有计算机背景: 建议选择系统集成项目管理工程师作为入门科目。…...
HTTP 请求的请求体是什么
HTTP 请求的请求体(request body)是指在 HTTP 请求中除了请求行(request line)、请求头(headers)之外的实际数据部分。请求体通常包含用于向服务器发送数据的信息,这些信息可以是表单数据、JSON 对象、XML 文档或其他任何形式的数据。 http请求一般包含的内容 HTTP(超…...
助力语音技术发展,景联文科技提供语音数据采集服务
语音数据采集是语音识别技术、语音合成技术以及其他语音相关应用的重要基础。采集高质量的语音数据有助于提高语音识别的准确性,同时也能够促进语音技术的发展。 景联文科技作为专业的数据采集标注公司,支持语音数据采集。可通过手机、专业麦克风阵列、专…...
PyTorch搭建神经网络入门教程
PyTorch搭建神经网络入门教程 在机器学习和深度学习中,神经网络是最常用的模型之一,而 PyTorch 是一个强大的深度学习框架,适合快速开发与研究。在这篇文章中,我们将带你一步步搭建一个简单的神经网络,并介绍 PyTorch…...
DockerUI仪表板定制终极指南:7步打造个性化监控界面
DockerUI仪表板定制终极指南:7步打造个性化监控界面 【免费下载链接】ui-for-docker A web interface for Docker, formerly known as DockerUI. This repo is not maintained 项目地址: https://gitcode.com/gh_mirrors/ui/ui-for-docker DockerUI是一个基于…...
Youtu-VL-4B-Instruct快速上手:3个命令启动服务、5个API调用示例、10分钟掌握核心能力
Youtu-VL-4B-Instruct快速上手:3个命令启动服务、5个API调用示例、10分钟掌握核心能力 你是不是经常遇到这样的场景:拿到一张复杂的图表,想快速提取里面的数据;或者看到一张产品图,想知道里面有哪些东西、分别在哪里&…...
SpringBoot单元测试实战:从Service到Controller的Mock技巧全解析
SpringBoot单元测试实战:从Service到Controller的Mock技巧全解析 单元测试是保障代码质量的重要防线,但在实际开发中,许多团队往往因为时间压力或技术复杂度而忽视这一环节。SpringBoot作为Java生态中最流行的框架之一,其单元测试…...
IBGP全互联实验+路由反射实验
知识点回顾IBGP全互联路由反射器实验先做IBGP全互联实验查看OSPF邻居关系R1上查看BGP邻居在R2上查看BGP邻居在R3上查看BGP邻居在R5上查看BGP邻居在R4上查看是否有去往10.10.5.5的路由在R5上查看是否有去往10.10.4.4的路由现在网络就能通了再做路由器反射实验在R1上跟R3上删除BG…...
免费开源一款聚合支付系统,已封装微信、支付宝、PayPal、京东、银联、QQ等支付方式
大家好,我是小悟。 众所周知,几乎所有商业应用都离不开支付功能,但支付集成却常常成为开发者的"痛点"。 面对微信支付、支付宝、银联等众多支付渠道,每个平台都有自己复杂的API、不同的签名机制和开发规范。 开发者往往…...
在WinForms里用OpenTK+SkiaSharp画个会动的波形图(.NET 8环境保姆级教程)
在WinForms里用OpenTKSkiaSharp画个会动的波形图(.NET 8环境保姆级教程) 最近在开发一个实时音频分析工具时,遇到了一个有趣的挑战:如何在Windows Forms应用中高效渲染动态波形图。经过多次尝试,我发现结合OpenTK的Ope…...
OpenClaw多模态调试台:交互式测试Kimi-VL-A3B-Thinking的chainlit技巧
OpenClaw多模态调试台:交互式测试Kimi-VL-A3B-Thinking的chainlit技巧 1. 为什么需要多模态调试台 上周我在开发一个基于Kimi-VL-A3B-Thinking的智能客服原型时,遇到了一个典型问题:模型对图片中文字的识别时好时坏。有时能准确提取发票金额…...
[具身智能-257]:监督式学习、无监督式学习、半监督式学习、强化学习的概念、差别、代码实现的原理
这四种学习范式,其实就是教机器“如何聪明”的四种不同方法。我们可以把它们想象成四种不同的“教育模式”,每种模式下,机器面临的“考题”和“老师”都不一样。🎓 监督学习:有老师手把手教核心概念 想象一下ÿ…...
**发散创新:基于Rust的轻量级权限管理库设计与开源许可证实践**在现代分布式
发散创新:基于Rust的轻量级权限管理库设计与开源许可证实践 在现代分布—...
OpenClaw+Qwen3-14b_int4_awq:智能客服对话日志分析工具
OpenClawQwen3-14b_int4_awq:智能客服对话日志分析工具 1. 为什么需要自动化客服日志分析 上个月我接手了一个小团队的客服优化项目,每天要处理上百条对话记录。手动翻阅这些聊天内容不仅耗时,还容易遗漏关键问题。最头疼的是,当…...
