mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-18 18:50:05 +08:00
bugfix:修复sqlite部分场景下锁竞争问题;新增插件恶意触发配置文件 (#2144)
* bugfix:修复sqlite部分场景下锁竞争问题;新增插件恶意触发配置文件 * 文件没同步完
This commit is contained in:
@@ -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:"
|
||||
|
||||
Reference in New Issue
Block a user