litefs.cache.form_cache 源代码

#!/usr/bin/env python
# coding: utf-8

"""
表单数据缓存模块

提供高效的表单数据缓存机制,避免重复解析
"""

from collections import OrderedDict
from time import time
from typing import Dict, Optional, Any


[文档] class FormCache: """ 表单数据缓存 使用 LRU (Least Recently Used) 策略管理缓存 支持自动过期和容量限制 """ def __init__( self, max_size: int = 1000, default_ttl: int = 300, ): """ 初始化表单缓存 Args: max_size: 最大缓存数量 default_ttl: 默认过期时间(秒) """ self.max_size = max_size self.default_ttl = default_ttl self._cache: OrderedDict = OrderedDict() self._access_time: Dict[str, float] = {} self._expire_time: Dict[str, float] = {}
[文档] def get(self, key: str) -> Optional[Dict[str, Any]]: """ 获取缓存的表单数据 Args: key: 缓存键 Returns: 缓存的表单数据,如果不存在或已过期则返回 None """ if key not in self._cache: return None # 检查是否过期 if key in self._expire_time and time() > self._expire_time[key]: self._remove(key) return None # 更新访问时间并移动到末尾(LRU) self._access_time[key] = time() self._cache.move_to_end(key) return self._cache[key]
[文档] def set(self, key: str, value: Dict[str, Any], ttl: Optional[int] = None) -> None: """ 设置缓存的表单数据 Args: key: 缓存键 value: 表单数据 ttl: 过期时间(秒),None 使用默认值 """ if ttl is None: ttl = self.default_ttl # 如果键已存在,先删除 if key in self._cache: self._remove(key) # 如果缓存已满,移除最久未使用的项 while len(self._cache) >= self.max_size: oldest_key = next(iter(self._cache)) self._remove(oldest_key) # 添加新项 self._cache[key] = value self._access_time[key] = time() self._expire_time[key] = time() + ttl
[文档] def delete(self, key: str) -> bool: """ 删除缓存项 Args: key: 缓存键 Returns: 是否删除成功 """ if key in self._cache: self._remove(key) return True return False
[文档] def clear(self) -> None: """清空所有缓存""" self._cache.clear() self._access_time.clear() self._expire_time.clear()
[文档] def cleanup_expired(self) -> int: """ 清理过期的缓存项 Returns: 清理的项数 """ current_time = time() expired_keys = [ key for key, expire_time in self._expire_time.items() if current_time > expire_time ] for key in expired_keys: self._remove(key) return len(expired_keys)
def _remove(self, key: str) -> None: """ 移除缓存项 Args: key: 缓存键 """ if key in self._cache: del self._cache[key] if key in self._access_time: del self._access_time[key] if key in self._expire_time: del self._expire_time[key] def __len__(self) -> int: """返回缓存大小""" return len(self._cache) def __contains__(self, key: str) -> bool: """检查键是否在缓存中""" return key in self._cache
[文档] def get_stats(self) -> Dict[str, Any]: """ 获取缓存统计信息 Returns: 缓存统计信息字典 """ return { "size": len(self._cache), "max_size": self.max_size, "default_ttl": self.default_ttl, }