news 2026/5/1 9:41:34

Flask-Caching深度详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flask-Caching深度详解

1. 他是什么

Flask-Caching 是 Flask 框架的一个扩展包。你可以把它理解为给 Flask 应用配备的一个“快速存取仓库”。

Flask 本身没有自带缓存功能。当应用收到请求时,即使请求的是完全相同的数据,每次都得把数据库翻一遍,或者把复杂的计算重来一遍。Flask-Caching 就是专门填补这个空白的:它提供了一个统一的接口,让你能轻松地把耗时操作的结果暂存起来,下次再用时直接取货,不用重新生产。

2. 他能做什么

举个例子:你做了一个新闻网站,首页的新闻列表每 5 分钟才更新一次,但用户可能是每秒都在刷。如果没有缓存,每刷一次数据库就得忙一次;有了 Flask-Caching,第一个用户访问时页面是“现做”的,之后的用户看到的直接是“热好”的版本,2 秒的加载时间可能瞬间降到 0.1 秒。

具体能做的事情分四层:

  • 缓存整个页面或接口:比如某个新闻详情页,缓存 10 分钟,10 分钟内不管谁来访问,都不需要查数据库。

  • 缓存函数的计算结果:比如一个根据标签生成相关文章列表的函数,只要传入的参数相同,就直接返回上次算好的结果。

  • 缓存模板里的局部片段:比如页脚的公司联系方式、侧边栏的排行榜,这些部分通常变化极慢,没必要每次渲染都重新生成。

  • 手动精细控制:比如把用户权限数据存进去,下次判断权限时直接读取。

3. 怎么使用

从简单到复杂,通常是这几种用法。

第一步:安装和初始化
就像给仓库配个管理员。初始化时指定把东西存在哪儿,是存内存里(速度快)、还是存 Redis(分布式)或文件系统。

python

from flask import Flask from flask_caching import Cache app = Flask(__name__) # 配置:把数据存在内存中,默认超时5分钟 app.config['CACHE_TYPE'] = 'SimpleCache' app.config['CACHE_DEFAULT_TIMEOUT'] = 300 cache = Cache(app)

第二步:缓存视图(最常见的用法)
在路由上加装饰器,告诉 Flask:“这个页面的结果存 50 秒。”

python

@app.route('/news') @cache.cached(timeout=50) def news(): # 模拟耗时2秒的数据库查询 return expensive_query()

第一个请求 2 秒,之后 50 秒内的请求都是毫秒级响应。

第三步:缓存函数的返回值
有些函数不是视图,但经常被调用。比如获取系统配置:

python

@cache.cached(timeout=600, key_prefix='site_config') def get_config(): return load_config_from_db()

注意这里的key_prefix是必须的,因为非视图函数不知道用哪个 URL 当钥匙。

第四步:记忆化(Memoize)—— 带参数的缓存
这是比较实用的功能。它会把函数每次传入的参数也作为缓存钥匙的一部分。比如根据用户 ID 查角色:

python

class User: @cache.memoize(timeout=60) def has_permission(self, resource): # 复杂的权限判断逻辑 return check_db(self.id, resource)

同一个用户查“编辑权限”,60 秒内只需要算一次。

第五步:手动存/取
更灵活的场景,比如某个耗时的 API 数据:

python

@app.route('/stats') def stats(): data = cache.get('user_stats') if data is None: data = compute_heavy_stats() cache.set('user_stats', data, timeout=120) return data

4. 最佳实践

根据实际项目经验,有几个原则比较通用:

  • 开发用 SimpleCache,生产用 Redis。SimpleCache 是存在内存里的,应用重启就丢了,多进程也无法共享。生产环境用 RedisCache,配置也很简单:
    app.config['CACHE_TYPE'] = 'RedisCache'
    app.config['CACHE_REDIS_URL'] = 'redis://localhost:6379/0'

  • 缓存一定要设过期时间。除非是万年不变的静态数据,否则必须有 timeout。不设过期时间就是埋坑,数据更新了用户还在看旧内容。

  • memoize 慎传对象。如果给@cache.memoize装饰的函数传入了一个数据库模型对象,Flask-Caching 会对这个对象做repr()来生成钥匙。如果对象的__repr__返回的是<User at 0x10a5b2e0>这种内存地址,那同一个用户每次请求钥匙都不一样,缓存形同虚设。建议传 user_id 这类稳定值。

  • 记得删缓存。当数据源发生变化时,主动把对应的缓存清理掉。比如用户更新头像后,执行cache.delete(f'profile_{user_id}')。对于 memoize,可以用cache.delete_memoized(user_has_permission, user_id, 'edit')

  • 模板片段缓存很有用。在 Jinja2 模板里可以直接这样写,把整个侧边栏区块缓存 10 分钟:
    {% cache 600 %}... 整个侧边栏的 HTML ...{% endcache %}

  • 钥匙前缀区分环境。配置CACHE_KEY_PREFIX,比如 'staging_' 或 'prod_',避免不同环境或不同应用互相污染数据。

5. 和同类技术对比

对比对象一:自己用 Redis / Memcached 客户端硬写

有的开发者在代码里直接import redis,用redis_client.get/set来实现缓存。

  • Flask-Caching 的优势:统一抽象。你不需要关心今天用的是 Redis,明天换 Memcached 或者文件缓存时代码要改哪里。Flask-Caching 把这层封装好了,改配置就行。另外,memoize这种基于函数名和参数的自动化钥匙生成,自己写很容易出错。

  • 劣势:多了一层封装,某些极端场景性能损耗可以忽略不计;一些 Redis 的高级数据结构(如 List、Set)无法通过通用接口操作。

对比对象二:Django 的缓存框架

Django 内置了非常完善的缓存体系。

  • Flask-Caching 的特点:作为第三方扩展,保持了 Flask 一贯的“轻量、灵活”。你需要什么后端就装什么库,没有强绑定。

  • Django 缓存的特点:Django 是“全家桶”,缓存系统与 ORM、模板、中间件深度整合。比如在 settings 里配好,ORM 的查询结果可以自动缓存。优点是省心,缺点是笨重。

  • 结论:Django 缓存更像自动驾驶,Flask-Caching 像手动挡——更直接,但也更清楚正在发生什么。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 4:07:44

如何理解词嵌入的维度?维度越大越好吗?

在学习自然语言处理&#xff08;NLP&#xff09;时&#xff0c;很多人都会遇到一个问题&#xff1a; 词嵌入的维度到底是什么意思&#xff1f; 为什么有的模型用 100 维&#xff0c;有的用 300 维&#xff0c;而 BERT 却是 768 维&#xff1f; 维度越大越好吗&#xff1f; 每…

作者头像 李华
网站建设 2026/5/1 4:08:28

SpringBoot打包可执行jar包启动方式:JarLauncher、PropertiesLauncher

文章目录1, 项目结构2, 默认打包可执行jar启动主类&#xff1a;JarLauncher3, 打包可执行jar启动主类&#xff1a;PropertiesLauncher1, 项目结构 springboot-tar-demo/ ├── src/ │ ├── main/ │ │ ├── assembly/ │ │ │ └── assembly.xml # 上述…

作者头像 李华
网站建设 2026/5/1 4:06:51

为什么 UI 半透明面板会出现“黑边”和“发灰”:一篇把你从玄学里拎出来的透明指南

你肯定遇到过这种场面: 你做了个很常见的 UI 弹窗: 背景来一层半透明黑遮罩,弹窗面板是圆角、带柔和透明边缘的 PNG。 在编辑器里一看——哎挺好。 一跑真机——圆角边缘一圈黑线;或者整张面板“发灰”,像蒙了一层雾;再或者跟背景叠一起颜色不对,黑得不干净、灰得不高级…

作者头像 李华
网站建设 2026/5/1 4:06:54

欧盟与印度自贸协定开启IT服务新时代

欧盟与印度达成的首个自由贸易协定可能推动印度IT服务提供商在欧洲大陆扩展业务&#xff0c;为其打开大量未开发的市场机遇。虽然北欧和比荷卢地区等较小经济体集群已经成为印度IT服务公司的成功市场&#xff0c;但在一些更大的经济体中&#xff0c;这些公司仍有巨大的增长空间…

作者头像 李华
网站建设 2026/5/1 4:04:50

Git Worktree + Claude Code:多终端并发开发完全实战

引言:等待 AI 的时间浪费 如果你已经开始使用 Claude Code 进行开发,一定遇到过这样的场景: 场景 1: 让 AI 分析一个复杂的 Bug,你坐在电脑前等了 5 分钟,AI 还在读代码… 场景 2: 让 AI 重构一个大模块,15 分钟过去了,你刷完了朋友圈,AI 还在工作… 场景 3: 临时有个紧急 Bug…

作者头像 李华
网站建设 2026/5/1 4:02:17

1.8 本章小结 记住这3点后面少踩坑

1.8 本章小结:记住这 3 点,后面少踩坑 本节学习目标 把第 1 章内容归纳成三条主线,便于记忆与复述。 明确与第 2 章(技术框架)的衔接点,减少学习断层。 用「少踩坑」清单做自检,避免常见概念与设计错误。 一、三条主线(记住这 3 点) 1. Agent 是什么、和普通程序差在…

作者头像 李华