群聊消息“已读”/“未读” 功能解决方案!

微信AI无感服务:上下文感知型交互如何重塑AI落地路径 在大模型能力日趋同质化的今天,AI产品真正的分水岭已从‘能否回答问题’转向‘能否理解用户当下意图’。上下文感知型服务成为关键突破口——它依托实时行为数据、本地化推理与动态意图建模,在不打断用户操作流的前提下完成任务闭环。这种能力不再依赖云端大模型堆砌,而是强调端云协同、隐私优先与场景深耦合,典型如微信AI通过长按、输入触发等原子动作,将AI能力无缝嵌入高频数字生活动线。其技术价值在于降低使用门槛、提升服务确定性,并为私域运营、C端提效与B端流程自动化提供可复用的轻量级范式。 阅读详情

一朋友和我讨论他前段时间面试某大公司的一题目:

企业IM比如企业微信、钉钉里面的群消息的有个已读未读的功能,发送者刚发出消息时,当前群里其他群成员都是未读状态,陆陆续续有人看了这个消息,这时候消息的详情变成x人已读,y人未读,如下图所示,有具体的已读未读列表(万恶的功能,看到同事or老板的消息不能假装没看到了),每条消息对应一个唯一的messageid(uint64_t),每个用户对应一个唯一的userid(uint64_t),应该如何保存这个消息对应的已读未读详情呢?

530ec94fa89be99f7c55adc62992e4b9.png

我第一时间给出一个很简单粗暴的方案:

对于每一个messageid,存当前readids + unreadids,当群成员A已读某一条消息时,把A userid从unreadids移除写到readids上就好了,客户端更新到messageid对应的详情列表,就可以展示m人已读,n人未读

显然这么简单粗暴的方案面试官是不会满意的,追问有没有更好的方案呢?

仔细分析,按照目前的设计,每一条消息,已读未读详情就要占用8B * 群成员数的内存,如果一个活跃的200人大群,每发一条消息,已读未读就要1600B,如果平均每天消息量是1k,那每个这样的群,每天就要1.6MB磁盘空间,对于客户端来说,特别是手机端,占用磁盘空间是用户不能接受的,又不能把工作消息删了,对于服务器端来说,用户群体如果特别大,那数据库存储这个成本也不小。

其实未读已读就是一个0/1的标记而已,可以维护一个bitmap来实现呢?具体应该怎么做呢?

群元信息保存userid到自增mapid的映射:

struct UserInfo 
{ 
 uint64_t userid;
 uint32_t mapid;
};

struct GroupMetaInfo 
{
 vector <UserInfo> members;
 string name;
 uint32_t maxid;
 // other info
};

这样群成员每加入一个群里,就有mapid<->usreid的双向映射了,假如群里有5个成员ABCDE, 那就对应mapid 1-5,messageid对应的消息详情存储就可以设计成:

{ uint32_t maxid, uint8_t readbit[]}

如上面的案例就是{5, readbit[0] =bin(0000 0000)}; 就占用了5B(4+1),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[]}。

新的方案带来怎样的收益呢?

  1. 增加自增mapid字段,一个群聊维护一份,成本几乎可以忽略不计

  2. 每个成员已读未读由8B(64bit)优化成2bit,减少62/64, 200人已读未读旧的方案1600B, 现在只需要(200/8) * 2 + 4 = 54 , 每条消息节约95%+

如果maxid如果到百万甚至千万级别,那岂不是灾难?

一般实际场景,群聊是会限制人数的,就算不断踢人加新人,那maxid最多也只能到企业人数。如果maxid达到一个特别大数字,已读未读对应的存储可以增加多一个flag,如果bitmap存储成本远超过最初的方案,可以用最初的方案来实现,客户端提前埋好兼容逻辑就可以了。

作者:小袁学习笔记

来源:www.toutiao.com/i6686735232772604429/

app里未读消息已读、未读是怎么设计的? 一款app,消息页面有:钱包通知、最近访客等各种通知类别,每个类别可能有新的通知消息,实现已读、未读功能,包括多少个未读,这个是怎么实现的呢?比如用户A访问了用户B的主页,难道用rabitmq给B发通知消息吗?量大了成本受得了吗?有没有成本低的方案呢 阅读详情

相关推荐

利用数据库在java实现已读未读消息公告

需求场景: 需要利用数据库来实现用户已读公告列表/未读公告列表/全部公告列表 实现思路: 原本的思路是建立一张用户公告关联的表,将所有公告和用户关联起来,然后用状态来判断和修改。但是这样用户一多,比如用户有10000个,每增加一条公告,就要多增加10000条数据,对数据库非常不友好。于是逆向思维,用户每次读取一张公告就判断表中是否有数据,如果没有就在表中插入一条数据。 具体实现: 首先准备两张表,公告表notice以及已读公告表notice_read。 CREATE TABLE `notice` ( `

Assisiwjj 8333

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

最初的设计是这样的,发送消息使用MQ异步发送,消息表中新增一个消息类型字段和接收的ID字段,消息类型分为角色、用户、小区、社区四种类型。回想上面的方案,虽然表中设计了阅读状态字段,但当消息不是按用户ID发送的时候,比如按社区发送,在消息表中是只有一条消息的,也就是说,一旦这个社区下任何一个居民阅读了这条消息,状态字段就会修改为已读,这就导致社区下其他居民看到这条消息的状态也是已读。但具体的业务中每条消息是有已读和未读的状态的,也就是说,用户点进消息详情,这条消息是要变为已读的。

Always206的博客 3300

java实现未读消息提醒源码-coderuci-public:一个为程序员设计的SpringBoot+MyBatis+MySQL问答论坛。内嵌

java实现未读消息提起源码编码器UCI CoderUCI 是一个 MIT 许可的开源项目。 这是一个专为程序员讨论而设计的问答网站。 在网站上,用户可以发布问题、生成标签、使用 Markdown 进行编辑、发表评论、搜索问题和接收通知。 关键词:Java、Spring Boot、Maven、MyBatis、MySQL、Flyway 阿尔法版本: 一、简介 主页 访问主页时,您可以概览用户提出的问题。 每个媒体缩略图都包含问题信息:提议者、问题内容、视图等。每个问题都通过一个标签进行分类,该标签显示在浅蓝色徽章中,以便您可以快速直观地了解问题。 您可能还会注意到右侧的热门话题趋势。 GitHub Oauth 本站目前只支持github用户登录。 只需单击右上角的登录按钮,它就会授权您并将您重定向回索引页面。 登录后,您将能够发布或回复或评论问题。 查看和评论问题 单击特定问题后,您将转到问题详细信息页面,您可以在其中以呈现的降价形式查看它。 您可以按日期/喜欢对答案进行排名。 当然,你可以回答这些问题。 该站点还支持二次评论,您可以在其中进行进一步的讨论。 发布问题 单击发布按钮,您将

[记录,求更好方案]大量用户消息已读未读存储方式

做一个消息提示,问题如下:如果系统给所有用户推送了一条站内消息,如何区分用户是否已读,从而实现取消红点或具体未读消息数量,总不可能所有消息全部放在一个表吧,那如果有1万个用户,同样的消息要发1万条,如果是数据库的话,长久下来,负担太大了。 1、内外总条数的提醒记录 使用redis的hash实现: hash的名称unread_msg_count hash的键user_id hash的值未读数 如果有新消息可以使用hincrby(unread_m...

郭栋的专栏 2144

关于Selenium3在MicrosoftEdge浏览器中出现的问题

前言 最近在做web自动化测试,所用环境是java+selenium3.141.59+MicrosoftEdge(Chromium)浏览器。 在调试的过程中,出现了很多问题。比如selenium3在Edge浏览器中远程调用中,不支持addArguments方法等 问题 1.Edge浏览器弹窗问题 在测试过程中,会出现弹出窗提示 ...

zhucheng1994的博客 2203

Palabos 并行计算与多物理场模拟实战指南

本文详细介绍了Palabos在并行计算与多物理场模拟中的实战应用。作为基于C++和LBM的开源CFD工具,Palabos通过MPI实现高效并行计算,特别适合处理复杂流体模拟问题。文章涵盖从基础安装、多物理场耦合技巧到性能优化策略,并分享工业级应用案例与调试经验,帮助开发者快速掌握这一强大工具。

4k5l6j7h8的博客 245

mysql消息已读未读_Redis实现信息已读未读状态提示

本文为大家分享了Redis实现信息已读未读状态提示的关键代码,希望可以给大家一些启发,具体内容如下前提:假如现在有2个模块需要提示消息:只要存在用户在上个时间点之后没有看过的信息就提示用户有新的信息思路如下:使用hash存储用户上次看过的时间,使用sortedset存储每个模块的每个信息产生的时间上代码:Map dataMap = new HashMap<>();Jedis jedis...

weixin_29377233的博客 3357

第三节: 串口通信(用CubeMX学习STM32)

用CubeMX学习STM32, 串口通信学习, 通过轮询方式和中断方式两种方式进行通信演示。 STM32F407zgt6

Kevin_8_Lee的博客 8904

mysql 海量数据的存储和访问解决方案

第1章  引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互 联网应用,每天几十亿的PV(page view页面浏览量,或点击量区别于UV(unique visitor))无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。通过数据切分来提高网站性能,横向扩展数据层已 经成为架构研发人员首选的方式。水平切分数据库,可以降低单台机器...

jc_benben的专栏 502

Ubuntu22.04安装ROS1

代表使用 2 线程进行编译,可以根据 CPU 适当调整。如果出现小乌龟窗口,说明安装成功 🎉!启动成功,则打开另一个终端,测试。需要解决一些兼容性问题,因为。由于 Ubuntu 22.04。过程,确保成功安装。

asafriend的博客 4648

实战游戏项目管理1-规划篇

1、前言 做研发管理10多年,进游戏行业8年,经验下来项目管理就是一门技术,结合不同行业不同项目加以不同管理方法,但原理基本一样,这里总结下游戏项目的管理一些实操方法 一般游戏确定立项前都需要做,项目预研产出一个游戏Demo,通过公司的立项评审,这个过程的项目管理相对简单一般由制作人或其他项目经理兼任,只有控制好总体时间与成本就好,这里按立项后开始讲。 2、游戏项目规划 ...

pengdali的专栏 2万+

具有用户已读状态功能的公告(1):数据库设计

1 需求 设计一个公告功能,要求可以让用户知晓已读未读状态 2 需求分析 公告,主要字段为标题和内容,一般是对于面向所有用户的,通常只需要一张表来保存。 消息,除了包含标题和内容外,还需要包含用户标识,从而实现用户对于消息读取状态的判断。 需求是既要有面向所有用户的功能,同时还需要有用户读取状态的标识

Mrqiang9001 1万+

电子技术设计——16×16点阵汉字显示设计

同时,设计还应注重提升显示品质,以保证汉字的稳定展示和观感舒适。本设计的目的是构建一个能够准确在LED点阵上展示汉字的系统,并允许用户通过输入设备来选择所需的汉字,我们将验证设计方案的实际操作性和效果,以确保其满足设计目标。在LED点阵显示和汉字信息处理技术的结合下,研究者们着手研究如何在LED点阵上有效地显示汉字,并提出了一系列显示算法和优化策略,旨在实现清晰且易于阅读的汉字显示效果。首先,你需要准备16×16的LED点阵面板,通常这些点阵是8×8点阵的两倍,因此可以由两个8×8的点阵组合而成。

weixin_68094467的博客 1533

解密broad-v1.hot文件:Qwen3.8-Flash-Next-ngram-table-NInfer-v3热行排名的构建方法

本文带你拆解 **Qwen3.8-Flash-Next-ngram-table-NInfer-v3** 项目中的 `broad-v1.hot` 热行排名文件:这个约 100 MB 的 n-gram 表行排名清单如何从多语言语料中构建、如何被逐字节校验,又如何在不同内存预算下测出缓存命中率。 ## broad-v1.hot 是什么?📦 [broad-v1.hot](https://link.g

gitblog_00215的博客 134

【ComfyUI】SD1.5 + ControlNet 边缘检测融合动漫转真人

本文介绍了一个基于ComfyUI的动漫转真人图像生成工作流,通过多模型协同实现高质量的二次元图像转换。该工作流集成了Canny线稿预处理、ControlNet结构控制、VAE编码解码和人脸精细化处理等核心环节,采用majicmixRealistic_v7作为主模型,配合yolov8、SAM等辅助模型。整个流程包含11个标准化步骤,从图像输入、预处理到最终超分输出,通过ControlNet引导和CLIP语义控制确保生成图像的写实感和结构准确性,特别针对人脸区域进行专业优化,最终可输出高分辨率写实人像。

Mr数据杨 1130

【教程4>第2章>第18节】 GMSK调制系统的FPGA开发与matlab对比验证

GMSK(高斯最小频移键控)是一种连续相位的频移键控(CPFSK)调制方法,它在数字通信中得到了广泛应用,特别是在移动通信系统中。GMSK通过限制频率偏差的累积来减少带外辐射,并通过使用高斯滤波器对。

FPGA/MATLAB学习教程/源码/项目合作开发 998

如何 10 分钟给现有 Vite 项目接入 Void:零改造升级指南

**Void** 是专为 Vite 打造的"构建 + 部署"一体化工具链:用 `npx void init` 把 Void 接入你的现有 Vite 项目,无需重构代码,即可获得服务端路由、类型安全的数据库 API、自动资源推断,以及 `npx void deploy` 一条命令部署到 Cloudflare 的完整能力。本文带你走完从安装到上线的全过程。 [![Void 与 Vite 项目接入氛围

gitblog_00217的博客 992

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

基于Spring Boot和MyBatis的师生答疑作业系统设计与实现

在高校教学管理中,师生之间的信息传递常因工具分散而效率低下。Spring Boot作为主流Java开发框架,通过自动配置简化了SSM整合流程,而MyBatis则提供了灵活的SQL映射能力,二者结合已成为构建信息化系统的常见技术组合。本文从系统设计角度出发,阐述如何基于Spring Boot与MyBatis搭建一套支持课程管理、答疑社区、作业提交与批改的教学辅助平台。内容涵盖需求拆解、数据库建模、核心模块实现及部署踩坑,重点讨论前后端分离下的权限控制、文件上传限制、时区一致性与并发幂等处理。这套方案不仅适用于

weixin_31236101的博客 86

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

sql查询 case 进行已读未读消息的处理

消息分为系统消息与个人消息。 思路:消息统一发送,用户点击某条消息后生成点击记录,代表已读,通过消息点击记录来区分已读未读。 1、数据库结构 CREATE TABLE `sh_push` ( `id` int(11) NOT NULL AUTO_INCREMENT, `type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0 系统消息 1 个人消息', `user_id` int(10) unsigned NOT NULL DEFAULT '0' C

༺墨༒眉༻ 1599

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Redis实现信息已读未读状态提示

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34249678的博客 2662

Java实现消息已读功能

关于消息已读奇奇怪怪的需求

产品经理克星(狗头) 3488

100 条“未读消息“ 怎么实现的?7 种技术方案安排

推送的场景比较多,比如有人关注我的公众号,这时我就会收到一条推送消息,以此来吸引我点击打开应用。消息推送(push)通常是指网站的运营工作等人员,通过某种工具对用户当前网页或移动设备APP进行的主动消息推送。消息推送一般又分为web端消息推送和移动端消息推送。上边的这种属于移动端消息推送,web端消息推送常见的诸如站内信、未读邮件数量、监控报警数量等,应用的也非常广泛。

程序员高级码农的博客 4252

使用Python实现微信自动回复未读消息——解放双手

使用Python和itchat库实现微信自动回复未读消息的功能。通过编写一个简单的脚本,我们可以轻松实现自动回复功能,提高消息处理的效率。然而,由于微信官方并没有直接提供API支持,因此我们在使用第三方库时需要注意安全性和隐私保护。同时,我们还可以根据实际需求扩展脚本的功能,实现更智能的自动回复。我们可以根据发送者的信息或消息内容来定制回复内容。比如,当接收到来自特定好友的消息时,回复特定的内容。'UserName1': '这是给UserName1的专属回复!',

master_chenchen的博客 2713

Spring Boot 使用WebSocket实现聊天功能:实时消息推送与已读未读管理(无外键)

数据库设计Message表存储消息内容和发送信息,不使用外键。表存储每个用户对每条消息的已读状态,同样不使用外键,采用messageId和userId作为关联。前端逻辑使用 WebSocket 实现实时消息推送。用户查看消息后,前端通知后端更新已读状态。后端逻辑使用 MyBatis 的Mapper 层和注解实现消息和状态的存储与更新。通过 WebSocket 处理消息的实时推送和用户状态的管理。

一名热爱编程和分享技术的开发者,我正在不断探索Java编程的各种奥妙,并乐于将我的学习心得分享给大家。 2003

Java中实现群公告已读未读

Java中实现群公告已读未读功能的探索 随着即时通讯技术的飞速发展,群聊成为我们日常生活中不可或缺的一部分。在这种场景中,群公告的“已读”和“未读”状态显得尤为重要。本文将探讨如何使用Java编程语言实现群公告的已读未读功能,同时附上相关的代码示例和图示。 功能需求 我们首先明确该功能的基本需求: 群公告可以被群成员查看...

weixin_42342010的博客 366
上一篇: 雷军做程序员时写的博客,真心强啊!
下一篇: 实体映射最强工具类:MapStruct 真香!
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值