bugfix:修复sqlite部分场景下锁竞争问题;新增插件恶意触发配置文件 (#2144)

* bugfix:修复sqlite部分场景下锁竞争问题;新增插件恶意触发配置文件

* 文件没同步完
This commit is contained in:
Copaan
2026-06-24 09:11:03 +08:00
committed by GitHub
parent 73cbe2a609
commit f4d2342693
39 changed files with 1577 additions and 829 deletions
+30 -20
View File
@@ -48,6 +48,7 @@ class DataAccess(Generic[T]):
# 添加缓存统计信息
_cache_stats: ClassVar[dict] = {}
_ENABLE_CACHE_STATS: ClassVar[bool] = False
# 空结果标记
_NULL_RESULT = "__NULL_RESULT_PLACEHOLDER__"
# 默认空结果缓存时间(秒)- 设置为5分钟,避免频繁查询数据库
@@ -87,12 +88,10 @@ class DataAccess(Generic[T]):
self.key_field = getattr(model_cls, "cache_key_field", key_field)
self.cache_type = getattr(model_cls, "cache_type", cache_type)
if not self.cache_type:
raise ValueError("缓存类型不能为空")
self.cache = Cache(self.cache_type)
self.cache = Cache(self.cache_type) if self.cache_type else None
# 初始化缓存统计
if self.cache_type not in self._cache_stats:
if self.cache_type and self.cache_type not in self._cache_stats:
self._cache_stats[self.cache_type] = {
"hits": 0, # 缓存命中次数
"misses": 0, # 缓存未命中次数
@@ -137,6 +136,12 @@ class DataAccess(Generic[T]):
stats["null_sets"] = 0
stats["deletes"] = 0
@classmethod
def _bump_cache_stat(cls, cache_type: str | None, key: str) -> None:
if not cls._ENABLE_CACHE_STATS or not cache_type:
return
cls._cache_stats[cache_type][key] += 1
def _build_cache_key_from_kwargs(self, **kwargs) -> str | None:
"""从关键字参数构建缓存键
@@ -191,7 +196,7 @@ class DataAccess(Generic[T]):
# 如果成功构建缓存键,尝试从缓存获取
if cache_key is not None:
data = await self.cache.get(cache_key)
data = await self.cache.get(cache_key) if self.cache else None
logger.debug(
f"{self.model_cls.__name__} key: {cache_key}"
f" 从缓存获取到的数据 {type(data)}: {data}"
@@ -199,7 +204,7 @@ class DataAccess(Generic[T]):
if data == self._NULL_RESULT:
# 空结果缓存命中
self._cache_stats[self.cache_type]["null_hits"] += 1
self._bump_cache_stat(self.cache_type, "null_hits")
logger.debug(
f"{self.model_cls.__name__} 从缓存获取到空结果: {cache_key}"
)
@@ -211,14 +216,14 @@ class DataAccess(Generic[T]):
return None
elif data:
# 缓存命中
self._cache_stats[self.cache_type]["hits"] += 1
self._bump_cache_stat(self.cache_type, "hits")
logger.debug(
f"{self.model_cls.__name__} 从缓存获取数据成功: {cache_key}"
)
return cast(T, data)
else:
# 缓存未命中
self._cache_stats[self.cache_type]["misses"] += 1
self._bump_cache_stat(self.cache_type, "misses")
logger.debug(f"{self.model_cls.__name__} 缓存未命中: {cache_key}")
except Exception as e:
logger.error(f"{self.model_cls.__name__} 从缓存获取数据失败: {kwargs}", e=e)
@@ -234,8 +239,9 @@ class DataAccess(Generic[T]):
cache_key = self._build_cache_key_for_item(data)
if cache_key is not None:
# 存入缓存
await self.cache.set(cache_key, data)
self._cache_stats[self.cache_type]["sets"] += 1
if self.cache:
await self.cache.set(cache_key, data)
self._bump_cache_stat(self.cache_type, "sets")
logger.debug(
f"{self.model_cls.__name__} 数据已存入缓存: {cache_key}"
)
@@ -249,8 +255,8 @@ class DataAccess(Generic[T]):
# 存入空结果缓存,使用较短的过期时间
await self.cache.set(
cache_key, self._NULL_RESULT, expire=self._NULL_RESULT_TTL
)
self._cache_stats[self.cache_type]["null_sets"] += 1
) if self.cache else None
self._bump_cache_stat(self.cache_type, "null_sets")
logger.debug(
f"{self.model_cls.__name__} 空结果已存入缓存: {cache_key},"
f" TTL={self._NULL_RESULT_TTL}秒"
@@ -343,8 +349,9 @@ class DataAccess(Generic[T]):
return False
# 删除缓存
await self.cache.delete(cache_key)
self._cache_stats[self.cache_type]["deletes"] += 1
if self.cache:
await self.cache.delete(cache_key)
self._bump_cache_stat(self.cache_type, "deletes")
logger.debug(f"已清除{self.model_cls.__name__}缓存: {cache_key}")
return True
except Exception as e:
@@ -416,8 +423,9 @@ class DataAccess(Generic[T]):
if cache_key is None:
return
await self.cache.delete(cache_key)
self._cache_stats[self.cache_type]["deletes"] += 1
if self.cache:
await self.cache.delete(cache_key)
self._bump_cache_stat(self.cache_type, "deletes")
logger.debug(
f"{self.model_cls.__name__} {action}: 已失效兼容缓存: {cache_key}"
)
@@ -543,8 +551,9 @@ class DataAccess(Generic[T]):
if cache_key is not None:
# 如果成功构建缓存键,直接删除缓存
await self.cache.delete(cache_key)
self._cache_stats[self.cache_type]["deletes"] += 1
if self.cache:
await self.cache.delete(cache_key)
self._bump_cache_stat(self.cache_type, "deletes")
logger.debug(
f"{self.model_cls.__name__} delete: 已删除缓存: {cache_key}"
)
@@ -558,8 +567,9 @@ class DataAccess(Generic[T]):
for item in items:
item_cache_key = self._build_cache_key_for_item(item)
if item_cache_key is not None:
await self.cache.delete(item_cache_key)
self._cache_stats[self.cache_type]["deletes"] += 1
if self.cache:
await self.cache.delete(item_cache_key)
self._bump_cache_stat(self.cache_type, "deletes")
if items:
logger.debug(
f"{self.model_cls.__name__} delete:"