From bd24165c58b5c1e12af745aa4b2808e3c2fc8b61 Mon Sep 17 00:00:00 2001 From: 16337 <1633794139@qq.com> Date: Thu, 19 Mar 2026 14:18:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=8C=BA=E5=9F=9F?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E7=BC=93=E5=AD=98=E5=8A=A0=205=20=E5=88=86?= =?UTF-8?q?=E9=92=9F=20TTL=EF=BC=8C=E6=94=B9=E5=90=8D=E5=90=8E=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E7=94=9F=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/notify_dispatch.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/services/notify_dispatch.py b/app/services/notify_dispatch.py index c06b204..0c3c32c 100644 --- a/app/services/notify_dispatch.py +++ b/app/services/notify_dispatch.py @@ -292,17 +292,20 @@ def _get_notify_persons(camera_id: str, alarm_level: int) -> tuple: db.close() -# 区域名称缓存(area_id → area_name),避免重复查询 -_area_name_cache: Dict[int, str] = {} +# 区域名称缓存(area_id → (area_name, expire_time)),5 分钟 TTL +_area_name_cache: Dict[int, tuple] = {} _iot_token_cache: Dict[str, str] = {"token": "", "expire": 0} +_AREA_CACHE_TTL = 300 # 5 分钟 + async def _get_area_name_from_iot(area_id: int) -> str: - """从 IoT 平台查询区域名称(带缓存)""" + """从 IoT 平台查询区域名称(带 TTL 缓存)""" if not area_id: return "" - if area_id in _area_name_cache: - return _area_name_cache[area_id] + cached = _area_name_cache.get(area_id) + if cached and cached[1] > __import__('time').time(): + return cached[0] try: import httpx import time @@ -338,7 +341,7 @@ async def _get_area_name_from_iot(area_id: int) -> str: if data.get("code") == 0 and data.get("data"): name = data["data"].get("areaName", "") if name: - _area_name_cache[area_id] = name + _area_name_cache[area_id] = (name, __import__('time').time() + _AREA_CACHE_TTL) return name except Exception as e: logger.warning(f"查询IoT平台区域名失败: area_id={area_id}, error={e}")