实现缓存装饰器,优化数据获取和存储逻辑

This commit is contained in:
Asankilp 2025-02-22 13:38:16 +08:00
parent e1bc81c9e1
commit aaa4056482
2 changed files with 53 additions and 31 deletions

View File

@ -2,14 +2,36 @@ from .instances import cache
def from_cache(key): def from_cache(key):
"""
当缓存中有数据时直接返回缓存中的数据否则执行函数并将结果存入缓存
"""
def decorator(func): def decorator(func):
def wrapper(*args, **kwargs): async def wrapper(*args, **kwargs):
cached = cache.get(key) cached = cache.get(key)
if cached: if cached:
return cached return cached
else: else:
result = func(*args, **kwargs) result = await func(*args, **kwargs)
cache.set(key, result) cache.set(key, result)
return result return result
return wrapper return wrapper
return decorator
def update_to_cache(key):
"""
执行函数并将结果存入缓存
"""
def decorator(func):
async def wrapper(*args, **kwargs):
result = await func(*args, **kwargs)
cache.set(key, result)
return result
return wrapper
return decorator

View File

@ -23,10 +23,11 @@ from ._types import DeveloperMessage
from .config import config from .config import config
from .constants import CODE_BLOCK_PATTERN, IMG_LATEX_PATTERN, OPENAI_NEW_MODELS from .constants import CODE_BLOCK_PATTERN, IMG_LATEX_PATTERN, OPENAI_NEW_MODELS
from .deal_latex import ConvertLatex from .deal_latex import ConvertLatex
from .decos import from_cache, update_to_cache
from .instances import cache from .instances import cache
nickname_json = None # 记录昵称 # nickname_json = None # 记录昵称
praises_json = None # 记录夸赞名单 # praises_json = None # 记录夸赞名单
loaded_target_list: List[str] = [] # 记录已恢复备份的上下文的列表 loaded_target_list: List[str] = [] # 记录已恢复备份的上下文的列表
NOT_GIVEN = NotGiven() NOT_GIVEN = NotGiven()
@ -156,30 +157,29 @@ async def make_chat_openai(
) )
@from_cache("praises")
def get_praises(): def get_praises():
global praises_json praises_file = store.get_plugin_data_file(
if praises_json is None: "praises.json"
praises_file = store.get_plugin_data_file( ) # 夸赞名单文件使用localstore存储
"praises.json" if not praises_file.exists():
) # 夸赞名单文件使用localstore存储 with open(praises_file, "w", encoding="utf-8") as f:
if not praises_file.exists(): json.dump(_praises_init_data, f, ensure_ascii=False, indent=4)
with open(praises_file, "w", encoding="utf-8") as f: with open(praises_file, "r", encoding="utf-8") as f:
json.dump(_praises_init_data, f, ensure_ascii=False, indent=4) data = json.load(f)
with open(praises_file, "r", encoding="utf-8") as f: praises_json = data
data = json.load(f)
praises_json = data
return praises_json return praises_json
@update_to_cache("praises")
async def refresh_praises_json(): async def refresh_praises_json():
global praises_json
praises_file = store.get_plugin_data_file("praises.json") praises_file = store.get_plugin_data_file("praises.json")
if not praises_file.exists(): if not praises_file.exists():
with open(praises_file, "w", encoding="utf-8") as f: with open(praises_file, "w", encoding="utf-8") as f:
json.dump(_praises_init_data, f, ensure_ascii=False, indent=4) # 异步? json.dump(_praises_init_data, f, ensure_ascii=False, indent=4) # 异步?
async with aiofiles.open(praises_file, "r", encoding="utf-8") as f: async with aiofiles.open(praises_file, "r", encoding="utf-8") as f:
data = json.loads(await f.read()) data = json.loads(await f.read())
praises_json = data return data
def build_praises() -> str: def build_praises() -> str:
@ -211,22 +211,21 @@ async def load_context_from_json(name: str, path: str) -> list:
return [] return []
@from_cache("nickname")
async def get_nicknames(): async def get_nicknames():
"""获取nickname_json, 优先来源于全局变量""" """获取nickname_json, 优先来源于缓存"""
global nickname_json filename = store.get_plugin_data_file("nickname.json")
if nickname_json is None: # noinspection PyBroadException
filename = store.get_plugin_data_file("nickname.json") try:
# noinspection PyBroadException async with aiofiles.open(filename, "r", encoding="utf-8") as f:
try: nickname_json = json.loads(await f.read())
async with aiofiles.open(filename, "r", encoding="utf-8") as f: except (json.JSONDecodeError, FileNotFoundError):
nickname_json = json.loads(await f.read()) nickname_json = {}
except (json.JSONDecodeError, FileNotFoundError):
nickname_json = {}
return nickname_json return nickname_json
@update_to_cache("nickname")
async def set_nickname(user_id: str, name: str): async def set_nickname(user_id: str, name: str):
global nickname_json
filename = store.get_plugin_data_file("nickname.json") filename = store.get_plugin_data_file("nickname.json")
if not filename.exists(): if not filename.exists():
data = {} data = {}
@ -238,18 +237,19 @@ async def set_nickname(user_id: str, name: str):
del data[user_id] del data[user_id]
with open(filename, "w", encoding="utf-8") as f: with open(filename, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4) json.dump(data, f, ensure_ascii=False, indent=4)
nickname_json = data return data
@update_to_cache("nickname")
async def refresh_nickname_json(): async def refresh_nickname_json():
"""强制刷新nickname_json, 刷新全局变量""" """强制刷新nickname_json"""
global nickname_json
# noinspection PyBroadException # noinspection PyBroadException
try: try:
async with aiofiles.open( async with aiofiles.open(
store.get_plugin_data_file("nickname.json"), "r", encoding="utf-8" store.get_plugin_data_file("nickname.json"), "r", encoding="utf-8"
) as f: ) as f:
nickname_json = json.loads(await f.read()) nickname_json = json.loads(await f.read())
return nickname_json
except (json.JSONDecodeError, FileNotFoundError): except (json.JSONDecodeError, FileNotFoundError):
logger.error("刷新 nickname_json 表错误:无法载入 nickname.json 文件") logger.error("刷新 nickname_json 表错误:无法载入 nickname.json 文件")