当前位置: 首页 > article >正文

[python]实现可以自动清除过期条目的缓存

由于有缓存图片验证码的需要,所以我找了一些开源的缓存想直接使用,结果要么太老旧,要么太复杂,要么和 fastAPI 整合有问题,所以才想到自己写一个简单的,够用就好。

本文讲述了如何实现一个简单的内存缓存,他可以把过期的键值自动清除,在缓存验证码等场合应该很好用。

它的基本实现思路是:在初始化的时候自动启动一个清理线程,轮询删除过期的键值。
在实现的过程中使用了 lock ,以保证多线程安全。
主要代码如下:

class Cache:
    def __init__(self, max_size, ttl):
        """
        初始化缓存类
        :param max_size: 缓存最大容量
        :param ttl: 每个缓存元素的生存时间(秒)
        """
        self.max_size = max_size
        self.ttl = ttl
        self.cache = {}  # 存储缓存数据
        self.lock = Lock()  # 保证线程安全
        self._start_cleanup_thread()  # 启动自动清理线程

    def _start_cleanup_thread(self):
        """启动后台线程定期清理过期缓存"""
        def cleanup():
            while True:
                time.sleep(1)
                self._remove_expired_keys()

        thread = Thread(target=cleanup, daemon=True)
        thread.start()

    def _remove_expired_keys(self):
        """移除过期的缓存键"""
        with self.lock:
            current_time = time.time()
            expired_keys = [
                key for key, (_, expire_at) in self.cache.items()
                if expire_at <= current_time
            ]
            for key in expired_keys:
                del self.cache[key]
                print(f"清理过期键:{key}")

    def add(self, key, value):
        """
        添加缓存元素
        :param key: 缓存键
        :param value: 缓存值
        :raises CacheFullError: 当缓存已满时抛出
        """
        with self.lock:
            if key in self.cache:
                # 如果键已存在,更新值和过期时间
                self.cache[key] = (value, time.time() + self.ttl)
                return
            if len(self.cache) >= self.max_size:
                print("缓存已满,无法添加新元素")  
                return Error.FULL
            self.cache[key] = (value, time.time() + self.ttl)
            return Error.OK

    def get(self, key):
        """
        获取缓存值
        :param key: 缓存键
        :return: 缓存值
        :raises KeyError: 当键不存在或过期时抛出
        """
        with self.lock:
            if key in self.cache:
                value, expire_at = self.cache[key]
                if time.time() < expire_at:
                    return Error.OK, value
                else:
                    del self.cache[key]  # 自动清除过期键
                    return Error.EXPIRED,None
            return Error.NOT_FOUND,None

以上是主要的逻辑,下面是全部代码下载地址:

  • gitee
  • github
  • gitcode

它已经实际应用在 langchain+llama3+Chroma RAG demo 中,有兴趣您也体验实际应用,并欢迎指正。

  • gitee
  • github
  • gitcode

🪐祝您好运🪐


http://www.kler.cn/a/467091.html

相关文章:

  • winform中使用panuon开源UI库的问题
  • Go语言的 的集合框架(Collections Framework)核心知识
  • vue3+Echarts+ts实现甘特图
  • 代码随想录算法【Day11】
  • 【工具类】RedisUtil 操作相关
  • 图像超分辨新SOTA!南洋理工提出InvSR,利用大型预训练扩散模型图像先验来提高 SR 性能, 登上Huggingface热门项目。
  • node.js内置模块之---stream 模块
  • 自动驾驶三维重建
  • Java 正则表达式入门与应用(详细版)
  • RocketMQ场景问题
  • 三甲医院等级评审八维数据分析应用(三)--主数据管理篇(下)
  • 小程序组件 —— 30 组件 - 背景图片的使用
  • xdoj 判断字符串子串
  • Cocos2dx Lua绑定生成中间文件时参数类型与源码类型不匹配
  • 综合课程设计I报告题目: 血氧仪设计
  • SCT12A0,一款2.7V-14V Vin、30W全集成同步升压转换器
  • 【hustoj注意事项】函数返回值问题
  • asp.net core 属性路由和约定路由
  • 用Redis缓存数据、SpringCache
  • lovelyAIMaster - 在windows任何地方调用AI进行输入
  • 如何批量注册Outlook邮箱账号并防止关联?
  • MySQL(五)MySQL图形化工具-Navicat
  • Oracle 多租户架构简介
  • 深入浅出 Pytest:自动化测试的最佳实践 pytest教程 程序测试 单元化测试
  • 面向对象分析和设计OOA/D,UML,GRASP
  • vue代理问题