cache 源代码

from hashlib import md5
from typing import Any

import pympler.asizeof as asizeof

from api.utils.logger import logger

__all__ = ["CacheDB"]


[文档]class CacheDB(object): """用于保存临时数据的键值对数据库""" def __init__(self): self._db = {}
[文档] def is_empty(self): return not self._db
[文档] def store(self, obj: Any, key: str = None, overwrite: bool = False) -> str: """ 存储一个对象, 返回其 key :param obj: 待存储的对象 :param key: 若不指定, 随机生成一个运行期间不会重复的 key :param overwrite: 存在相同的 key 时是否覆盖 :return: 对象的 key """ if not key: hash_str = str(id(obj)) key = md5(hash_str.encode("utf-8")).hexdigest() exist = key in self._db if (not exist) or (exist and overwrite): logger.debug(f"Store {obj} -> <Key {key}>") self._db[key] = obj return key
[文档] def fetch(self, key: str) -> Any: """从数据库读取一个对象""" ret = self._db.get(key) logger.debug(f"Fetch <Key {key}> -> {ret if ret else 'Nothing Found'}") return ret
[文档] def update(self, key: str, value: Any) -> str: """更新 key 绑定的对象""" if key in self._db: logger.debug(f"Update <Key {key}> -> {value}") self._db[key] = value return key
[文档] def size(self) -> float: """获取缓存对象的大小(KB)""" return asizeof.asizeof(self._db) / 1024
[文档] def clear(self) -> float: """清空数据, 返回清理的内存大小(KB)""" logger.warning(f"CacheDB has been cleared, object in total: {len(self._db)}") size = self.size() self._db.clear() return size