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

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 像手动挡——更直接,但也更清楚正在发生什么。

http://www.jsqmd.com/news/371261/

相关文章:

  • Flask 技术栈
  • 为什么同样是学过C++,有人面试碾压,有人开口就怂?差距在这18个C++硬核项目
  • Java常用底层数据结构设计思想-集合类-复用强相关的闲置变量
  • 基金申请季必备:这份攻略帮你轻松拿下项目
  • Flask-Login深度详解
  • 企业数字化转型的AI智慧密码,AI应用架构师的方案策略全解
  • SSH:Windows系统、Linux系统配置如此简单
  • Flask jsonify 深度详解
  • 2026年热门的西安JSZWF12-10R型电压互感器/西安LSY-10型电流互感器工厂采购指南如何选(实用) - 行业平台推荐
  • SSH:那些事,so简单~
  • Flask-Mail 深度详解
  • 2026年质量好的微型减速电机/蜗杆减速电机哪家强品牌厂家推荐 - 行业平台推荐
  • 大数据OLAP实战:如何构建高效分析系统
  • 2026年质量好的西安低温电池/西安-70℃~80℃低温电池哪家强生产厂家实力参考 - 行业平台推荐
  • 大数据场景下RabbitMQ的消息发送速率控制
  • 2026年口碑好的意大利缓冲托底轨/抽屉缓冲托底轨哪家靠谱可靠供应商参考 - 行业平台推荐
  • 2026年工程专用建筑模板/木质建筑模板哪家质量好厂家实力参考 - 行业平台推荐
  • KDGGW-Y60型全自动钢管弯曲试验机
  • 滤波器系数设计工具
  • 2026激光切管机十大品牌权威排名(十强争霸榜) - 匠言榜单
  • 2026年靠谱的实验室平板硫化机/东莞平板硫化机供应商推荐怎么联系(畅销) - 行业平台推荐
  • 中国移动 (600941) 企业投资研究报告 2026年2月11日
  • UV紫外相机的简便介绍和场景应用
  • ANT-801S 震动传感器
  • 【YOLOv13多模态涨点改进】独家创新首发 | CVPR 2024 | 引入BIEF特征交互融合模块, 提升红外与可见光多模态融合,利用跨模态注意力机制挖掘互补信息,助力YOLO多模态检测高效涨点
  • (二)日常工作流 - git mv 命令的使用 - 教程
  • 高清图像月球火星巨石陨石坑检测数据集VOC+YOLO格式4322张3类别
  • 2026年热门的无水小便器/发泡小便器厂家推荐及采购参考 - 行业平台推荐
  • 2026年有实力的电动平移门,电动平开门厂家品牌推荐清单 - 品牌鉴赏师
  • 2026年比较好的南京空压机租赁/空压机回收生产厂家实力参考哪家强(更新) - 行业平台推荐