From b62fc929f85c6ef4fd9287e2955cc505d2013678 Mon Sep 17 00:00:00 2001 From: liuwei Date: Mon, 19 Jan 2026 15:50:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9B=B4=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E5=87=8F=E5=B0=91=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/wechat/member_monitor.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/utils/wechat/member_monitor.py b/utils/wechat/member_monitor.py index 2e6ee8b..2c083cb 100644 --- a/utils/wechat/member_monitor.py +++ b/utils/wechat/member_monitor.py @@ -45,21 +45,24 @@ class ChatroomMemberMonitor: if changes['has_changes']: await self._process_changes(group_id, changes, api_members) - # 5. 更新缓存 (将最新的列表保存到数据库) - # 注意:这里我们使用 save_chatroom_member_simple 更新所有成员 - # 为了保持一致性,可以选择先删除旧的再插入,或者依赖 save_chatroom_member_simple 的 ON DUPLICATE KEY UPDATE - # 考虑到有人离开,单纯 update 可能不够(离开的人还在库里),所以应该处理删除逻辑 - # save_chatroom_member_simple 主要是插入/更新,不会删除不存在的人 + # 5. 差异化更新缓存 (只处理变动的数据,避免大批量读写) - # 所以需要从数据库中删除已经离开的成员 + # 5.1 删除已经离开的成员 if changes['removed']: removed_wxids = [m['wxid'] for m in changes['removed']] self._remove_members_from_db(group_id, removed_wxids) - # 保存/更新现有的成员 - if api_members: - self.db.save_chatroom_member_simple(group_id, api_members) - self.logger.info(f"群 {group_id} 成员缓存已更新") + # 5.2 保存新增的成员 + if changes['added']: + self.db.save_chatroom_member_simple(group_id, changes['added']) + self.logger.info(f"群 {group_id} 新增 {len(changes['added'])} 名成员缓存") + + # 5.3 更新修改的成员 + if changes['modified']: + modified_members = [m['member'] for m in changes['modified']] + self.db.save_chatroom_member_simple(group_id, modified_members) + self.logger.info(f"群 {group_id} 更新 {len(modified_members)} 名成员缓存") + else: self.logger.info(f"群 {group_id} 成员无变化") @@ -77,7 +80,7 @@ class ChatroomMemberMonitor: 'wxid': wxid, 'nick_name': m.get('NickName', ''), 'display_name': m.get('DisplayName', ''), - # 可以在这里添加更多需要对比的字段 + 'raw_data': m # 保存原始数据用于数据库更新 } # 构建 DB 成员字典 {wxid: member_info}