From a572ac5b0ad836783d3111e9d7a0cdb8e61d636d Mon Sep 17 00:00:00 2001 From: MySxan Date: Tue, 2 Dec 2025 05:31:52 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0LRU=E4=BB=A5=E9=99=90?= =?UTF-8?q?=E5=88=B6last=5Fmessages=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chat/message_receive/chat_stream.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/chat/message_receive/chat_stream.py b/src/chat/message_receive/chat_stream.py index 81f78901..ac2d7a94 100644 --- a/src/chat/message_receive/chat_stream.py +++ b/src/chat/message_receive/chat_stream.py @@ -3,6 +3,7 @@ import hashlib import time import copy from typing import Dict, Optional, TYPE_CHECKING +from collections import OrderedDict from rich.traceback import install from maim_message import GroupInfo, UserInfo @@ -20,6 +21,9 @@ install(extra_lines=3) logger = get_logger("chat_stream") +# LRU + TTL 配置 +MAX_LAST_MESSAGES_CACHE = 5000 # 最大缓存消息数 + class ChatMessageContext: """聊天消息上下文,存储消息的上下文信息""" @@ -127,7 +131,8 @@ class ChatManager: def __init__(self): if not self._initialized: self.streams: Dict[str, ChatStream] = {} # stream_id -> ChatStream - self.last_messages: Dict[str, "MessageRecv"] = {} # stream_id -> last_message + self.last_messages: OrderedDict[str, "MessageRecv"] = OrderedDict() # stream_id -> last_message + self.last_message_timestamps: Dict[str, float] = {} # stream_id -> timestamp try: db.connect(reuse_if_open=True) # 确保 ChatStreams 表存在 @@ -167,6 +172,15 @@ class ChatManager: message.message_info.group_info, ) self.last_messages[stream_id] = message + self.last_messages.move_to_end(stream_id) + self.last_message_timestamps[stream_id] = time.time() + + # LRU + if len(self.last_messages) > MAX_LAST_MESSAGES_CACHE: + oldest_key, _ = self.last_messages.popitem(last=False) + self.last_message_timestamps.pop(oldest_key, None) + logger.debug(f"LRU 淘汰: 移除最老的消息 {oldest_key},当前缓存数: {len(self.last_messages)}") + # logger.debug(f"注册消息到聊天流: {stream_id}") @staticmethod