首页 > 编程问答 >在flask缓存中指定每个函数的缓存阈值(执行函数时清除旧值)

在flask缓存中指定每个函数的缓存阈值(执行函数时清除旧值)

时间:2024-08-02 16:50:30浏览次数:5  
标签:python flask flask-caching

使用 flask-caching memoize 的默认行为是如果指定的超时已到则执行该函数,然后返回并保存新结果。但是,现在过时的(之前缓存的)结果不会被删除。这对于大多数应用程序来说没问题,但如果缓存结果很大,就会出现问题。

flask-caching 暴露 CACHE_THRESHOLD ( https://flask-caching.readthedocs.io/en/latest/ )来控制通过指定总共保留多少个文件来实现此行为。将其设置为 1 应该在缓存中只保留 1 个项目,因此只有最近执行的函数才被允许保留副本。

有什么方法可以控制每个函数吗?理想情况下,我有一些函数,我不关心项目是否被保留(因为大小不是问题),但其他函数的返回值太大,我想在函数执行后立即删除旧的缓存值超时后再次超时。

我知道有一种方法 delete_memoized 可以在函数的基础上执行此操作,但如果我使用它来手动清除缓存,我需要知道它是否已过期,并且我'我不确定是否有办法做到这一点(除了这个逻辑已经在 flask-caching 端实现,所以我真的不认为有必要为这样的事情重新发明轮子)。


不幸的是, flask-caching 没有内置的方法来为每个函数指定缓存阈值。 CACHE_THRESHOLD 选项是一个全局设置,适用于所有使用 flask-caching 缓存的内容。

但是,可以通过结合使用 delete_memoized 装饰器和缓存键来实现所需的行为。这个想法是在调用缓存函数之前删除该函数的旧缓存条目。以下是如何操作:

from flask import Flask
from flask_caching import Cache

app = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE': 'simple'})

def generate_cache_key(function, *args, **kwargs):
    # 为给定函数及其参数生成唯一缓存键
    key = function.__name__ + str(args) + str(kwargs)
    return key

def memoized_with_threshold(timeout=None, unless=None):
    def decorator(f):
        @cache.memoize(timeout=timeout, unless=unless)
        def decorated_function(*args, **kwargs):
            # 在调用缓存函数之前删除旧缓存条目
            cache.delete_memoized(f, *args, **kwargs)
            return f(*args, **kwargs)
        return decorated_function
    return decorator

@app.route('/large_data')
@memoized_with_threshold(timeout=60)
def large_data():
    # ... 生成和返回大型数据集 ...
    return large_dataset

@app.route('/small_data')
@cache.memoize(timeout=60)
def small_data():
    # ... 生成和返回小型数据集 ...
    return small_dataset

在这个例子中:

  • memoized_with_threshold 是一个自定义装饰器,它封装了 cache.memoize
  • decorated_function 内部,我们首先使用 cache.delete_memoized(f, *args, **kwargs) 删除与当前参数对应的函数 f 的任何现有缓存条目。
  • 然后,我们像往常一样调用并返回缓存函数。

使用此设置, large_data 函数将在每次执行后有效地清除其缓存,而 small_data 函数将使用默认的缓存行为。

这种方法避免了重新实现缓存逻辑,因为它利用了 flask-caching 提供的现有功能。但是,需要注意的是,使用 delete_memoized 可能会稍微增加开销,因为它会在每次函数调用之前使缓存无效。

标签:python,flask,flask-caching
From: 78824558

相关文章

  • 如何使用 Python 在 2D 曲面上切割 3D 体积?
    考虑3D中的闭合表面网格(mesh1),由两个合并块组成,如图所示。两个合并块,具有不同颜色的细分补丁。网格以STL文件形式给出,并被细分分成不同的补丁。每个面片都在STL文件中保存为单独的实体。此外,我有一个由STL文件给出的弯曲2D表面网格(......
  • Python教程(十):面向对象编程(OOP)
    目录专栏列表前言一、面向对象编程概述1.1类和对象1.2继承1.3多态1.4封装二、Python中的类和对象2.1定义类2.2`__init__`函数解释2.3创建对象三、继承3.1基本继承3.2创建子类对象四、多态五、封装六.访问限制七、综合实例结语专栏列表Python教程(一):环......
  • Qt C++ 调用 Python 之 PyObject* 数据类型转换
    整数:PyLong_FromLong和PyLong_AsLong类型检查函数:PyLong_Check()intcppInt=42;//C++整数转换为Python整数对象PyObject*pyInt=PyLong_FromLong(cppInt);//Python整数对象转换为C++整数longcppIntFromPy=PyLong_AsLong(pyInt);Py_DECREF(pyInt)......
  • Python 警告:重试(重试(总计=4,连接=无,读取=无,重定向=无,状态=无))
    我正在尝试pipinstall--upgradepip并保持收到此错误:WARNING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))afterconnectionbrokenby'ProxyError('Cannotconnecttoproxy.',NewConnectionError('<......
  • {Python} 有没有办法从函数中“提取”返回值变量并在其他地方使用它,而不调用原始函数?
    第一次在这里发帖。对python来说相对较新,我正在开发一个程序,它基本上是一个随机故事生成器,用于学习语言、发展技能并添加到我的投资组合中。我有一个主文件(最初启动该程序)、一个简介文件(对于介绍部分,获取用户名以及我试图“提取”user_name变量的位置),一个函数文件,其中包......
  • 为什么我在 Python 中的 Skip-Gram 实现会产生不正确的结果?
    我正在使用Python实现Word2Vec的Skip-Gram模型。然而,正如生成的嵌入及其可视化所示,我的模型似乎无法正常工作。这是嵌入的3D图的示例,它显示单词聚集在一起并重叠,因此很难区分它们:我怀疑问题在于我的实现而不是绘图函数。importnumpyasnpfromnltk.corpusimpor......
  • Flask
    FlaskFlask说明“Flask”是一个在Python编程语言中广泛使用的轻量级Web应用框架。重要亮点Flask的特点:Flask具有简洁、灵活和易于扩展的特点,它为开发者提供了一个简单而强大的基础,以便构建各种类型的Web应用程序。微框架的优势:作为一个微框架,Flask只提供了核心功能......
  • 基于SpringBoot的智能购房推荐系统-09040(免费领源码)可做计算机毕业设计JAVA、PHP、爬
    Springboot智能购房推荐系统摘 要近年来随着我国经济的高速发展,房地产业也随之蓬勃发展,尤其是最近国家新出台的房改政策。鼓励居民购房,这对房产公司无疑是一个极好的发展势头。尤为重要的是,近几年随着信息技术和电子商务的快速发展,许多企业都开发了自己房产信息软件。智......
  • Python 基础教学 - 开发规范
    Python基础教学-开发规范一、引言在Python编程中,遵循良好的开发规范是编写高质量、可维护代码的关键。本文将为您详细介绍Python开发中的一些重要规范,帮助您养成良好的编程习惯。二、代码布局缩进使用4个空格进行缩进,避免使用制表符。示例:ifTrue:p......
  • Python基础学习笔记(一)
    文章目录一、下载Python二、变量三、数据类型四、运算符五、语句六、容器类型七、函数function八、常用API九、面向对象类的创建:创建对象:实例成员:实例方法:类成员:静态方法:十、三大特征:封装、继承、多态十一、六大原则:Python基础学习笔记(二)一、下载Python官网:https......