如何使用 Flask-Caching 提高性能?

server/2025/1/25 2:13:38/

在 Flask 中,使用 Flask-Caching 可以显著提高应用的性能,尤其是对于计算密集型操作、数据库查询或外部 API 调用。Flask-Caching 通过存储数据的副本减少重复计算,从而加快响应速度。


1. 安装 Flask-Caching

首先,安装 Flask-Caching:

pip install Flask-Caching

2. 配置 Flask-Caching

在 Flask 应用中,配置缓存类型和参数,例如使用内存、Redis、文件系统等。

示例:使用内存缓存

python">from flask import Flask, request
from flask_caching import Cacheapp = Flask(__name__)# 配置 Flask-Caching(使用简单的内存缓存)
app.config['CACHE_TYPE'] = 'SimpleCache'  # 使用简单内存缓存
app.config['CACHE_DEFAULT_TIMEOUT'] = 300  # 默认缓存超时(秒)cache = Cache(app)@app.route('/')
@cache.cached(timeout=60)  # 为此路由缓存60秒
def index():return "Hello, World!"if __name__ == '__main__':app.run(debug=True)

3. 常见缓存类型配置

Flask-Caching 支持多种缓存存储后端,常见配置如下:

缓存类型CACHE_TYPE依赖项
内存缓存SimpleCache
Redis 缓存RedisCachepip install redis
文件系统缓存FileSystemCache
Memcached 缓存MemcachedCachepip install pymemcache
Null(禁用缓存)NullCache

1. 使用 Redis 作为缓存:

python">app.config['CACHE_TYPE'] = 'RedisCache'
app.config['CACHE_REDIS_HOST'] = 'localhost'
app.config['CACHE_REDIS_PORT'] = 6379
app.config['CACHE_REDIS_DB'] = 0
app.config['CACHE_DEFAULT_TIMEOUT'] = 600  # 10分钟

2. 使用文件系统缓存:

python">app.config['CACHE_TYPE'] = 'FileSystemCache'
app.config['CACHE_DIR'] = '/tmp/flask_cache'

4. Flask-Caching 的使用方式

1. 缓存整个视图函数

python">@app.route('/data')
@cache.cached(timeout=120)  # 120秒缓存
def expensive_query():import timetime.sleep(5)  # 模拟耗时操作return "Expensive data fetched!"

2. 缓存函数调用结果

如果想要缓存某个函数的计算结果:

python">@cache.memoize(timeout=300)
def compute_expensive_result(x, y):import timetime.sleep(5)  # 模拟耗时return x + y@app.route('/compute')
def compute():result = compute_expensive_result(10, 20)return f"Computed result: {result}"

3. 基于请求参数缓存

你可以通过 make_cache_key 方法让缓存基于 URL 参数变化。

python">@app.route('/user')
@cache.cached(timeout=60, query_string=True)
def user_profile():username = request.args.get('name', 'Guest')return f"Hello, {username}!"

例如:

  • GET /user?name=Alice 会缓存 Alice 的数据
  • GET /user?name=Bob 会缓存 Bob 的数据

5. 手动控制缓存

1. 设置缓存

python">cache.set('my_key', 'my_value', timeout=300)  # 设置 300 秒

2. 获取缓存

python">value = cache.get('my_key')
if value is None:value = "New Value"cache.set('my_key', value, timeout=300)
print(value)

3. 删除缓存

python">cache.delete('my_key')

4. 清除所有缓存

python">cache.clear()

6. 高级用法

1. 基于请求 URL 生成缓存键

你可以自定义缓存键,使缓存结果针对不同的用户或查询参数:

python">def custom_cache_key():return request.full_path  # 以完整 URL 作为缓存键@app.route('/product')
@cache.cached(timeout=300, key_prefix=custom_cache_key)
def product():return "Product data"

2. 缓存片段

如果想要在模板中缓存某些片段,可以在视图函数内部使用缓存:

python">@app.route('/dashboard')
def dashboard():stats = cache.get('dashboard_stats')if not stats:stats = expensive_dashboard_calculation()cache.set('dashboard_stats', stats, timeout=600)return render_template('dashboard.html', stats=stats)

7. 监控和调试缓存

启用 Flask 的调试模式并添加日志,以查看缓存的命中情况:

python">app.config['DEBUG'] = True
app.config['CACHE_TYPE'] = 'SimpleCache'
app.config['CACHE_DEFAULT_TIMEOUT'] = 60

启用 System.debug 记录缓存的操作:

python">import logging
logging.basicConfig(level=logging.DEBUG)

8. 常见问题及解决方案

  1. 缓存未生效?

    • 确保已正确设置 CACHE_TYPE,并启用了 CACHE_DEFAULT_TIMEOUT
    • 确保请求没有 no-cache 头,浏览器可能绕过缓存。
  2. 如何处理缓存依赖变化?

    • 手动 cache.delete() 删除相关数据的缓存。
  3. 如何避免过期导致并发请求?

    • 使用双缓存策略,设置短超时和长超时来减少缓存失效影响。

总结

使用 Flask-Caching 提升性能的关键点:

  1. 选择合适的缓存后端(如 Redis、文件、内存等)。
  2. 在性能瓶颈处添加缓存,如数据库查询或复杂计算。
  3. 使用 @cache.cached@cache.memoize 避免重复处理。
  4. 在适当时机手动清理缓存,防止数据陈旧。

如果你需要更复杂的缓存策略,可以考虑:

  • Flask-Limiter 进行速率限制。
  • Celery 进行异步任务处理,与缓存结合使用。

http://www.ppmy.cn/server/161179.html

相关文章

华为小米vivo向上,苹果荣耀OPPO向下

日前,Counterpoint发布的手机销量月度报告显示,中国智能手机销量在2024年第四季度同比下降3.2%,成为2024年唯一出现同比下滑的季度。而对于各大智能手机品牌来说,他们的市场份额和格局也在悄然发生变化。 华为逆势向上 在2024年第…

Java高频面试之SE-15

hello啊,各位观众姥爷们!!!本牛马baby今天又来了!哈哈哈哈哈嗝🐶 String 怎么转成 Integer 的?它的原理是? 在 Java 中,要将 String 转换为 Integer 类型,可…

国家安全部发布《网络安全法》解读

《中华人民共和国网络安全法》于2016年11月7日发布,自2017年6月1日起施行,是我国第一部全面规范网络空间安全管理方面的基础性法律。这部法律是为保障网络安全,维护网络空间主权和国家安全、社会公共利益,保护公民、法人和其他组织…

Java实战:Spring Boot application.yml配置文件详解

本文将详细介绍Spring Boot application.yml 配置文件的使用和配置项。我们将探讨 application.yml 文件的基本概念,以及如何使用它来配置Spring Boot应用程序的各个方面。此外,我们将通过具体的示例来展示如何配置不同的Spring Boot组件,如数…

【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发之常见布局

目录 1 -> 自适应布局 1.1 -> 线性布局 1.1.1 -> 线性布局的排列 1.1.2 -> 自适应拉伸 1.1.3 -> 自适应缩放 1.1.4 -> 定位能力 1.1.5 -> 自适应延伸 1.2 -> 层叠布局 1.2.1 -> 对齐方式 1.2.2 -> Z序控制 1.3 -> 弹性布局 1.3.1…

亿坊软件前端命名规范

在前端开发中,文件命名的重要性不言而喻。由于历史原因和个人习惯,不同的开发者在命名DOM结构、图片和CSS文件时,可能会产生不一致的情况。这不仅会导致维护成本增加,还会降低团队协作效率。因此,制定一套统一的命名规…

低代码系统-产品架构案例介绍、简道云(七)

今天分析另外一个零代码、低代码产品-简道云,跟所有低代码产品的架构图一样,高、大、炫、美。 依然是从下至上,从左到右的顺序。 开发层 搭建中心 表单、流程、报表、用户中心,还是这些内容,自定义打印很多平台都有&am…

如何给自己的域名配置免费的HTTPS How to configure free HTTPS for your domain name

今天有小伙伴给我发私信,你的 https 到期啦 并且随手丢给我一个截图。 还真到期了。 javapub.net.cn 这个网站作为一个用爱发电的编程学习网站,用来存编程知识和面试题等,平时我都用业余时间来维护,并且还自费买了服务器和阿里云…