python flask-caching模块缓存详解

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: python flask-caching模块缓存详解

python 模块 flask-caching 缓存

文章目录

1. 介绍

为了尽量减少缓存穿透,同时减少web的响应时间,我们可以针对那些需要一定时间才能获取结果的函数和那些不需要频繁更新的视图函数提供缓存服务,可以在一定的时间内直接返回结果而不是每次都需要计算或者从数据库中查找。flask_caching插件就是提供这种功能的神器。

2. 安装

$ easy_install Flask-Caching
$ pip install Flask-Caching


3. 配置参数

CACHE_TYPE:设置缓存的类型
# 下面五个参数是所有的类型共有的
CACHE_NO_NULL_WARNING = "warning" # null类型时的警告消息
CACHE_ARGS = []    # 在缓存类实例化过程中解包和传递的可选列表,用来配置相关后端的额外的参数
CACHE_OPTIONS = {}    # 可选字典,在缓存类实例化期间传递,也是用来配置相关后端的额外的键值对参数
CACHE_DEFAULT_TIMEOUT # 默认过期/超时时间,单位为秒
CACHE_THRESHOLD    # 缓存的最大条目数
CACHE_TYPE = null # 默认的缓存类型,无缓存
CACHE_TYPE = 'simple' # 使用本地python字典进行存储,线程非安全
CACHE_TYPE = 'filesystem' # 使用文件系统来存储缓存的值
CACHE_DIR = "" # 文件目录
CACHE_TYPE = 'memcached' # 使用memcached服务器缓存
CACHE_KEY_PREFIX # 设置cache_key的前缀
CAHCE_MEMCACHED_SERVERS    # 服务器地址的列表或元组
CACHE_MEMCACHED_USERNAME # 用户名
CACHE_MEMCACHED_PASSWORD # 密码
CACHE_TYPE = 'uwsgi' # 使用uwsgi服务器作为缓存
CACHE_UWSGI_NAME # 要连接的uwsgi缓存实例的名称
CACHE_TYPE = 'redis' # 使用redis作为缓存
CACHE_KEY_PREFIX # 设置cache_key的前缀
CACHE_REDIS_HOST  # redis地址
CACHE_REDIS_PORT  # redis端口
CACHE_REDIS_PASSWORD # redis密码
CACHE_REDIS_DB # 使用哪个数据库
# 也可以一键配置
CACHE_REDIS_URL    连接到Redis服务器的URL。示例redis://user:password@localhost:6379/2

4. cache方法

cache.cached:装饰器,装饰无参数函数,使得该函数结果可以缓存
参数:
timeout:超时时间
key_prefix:设置该函数的标志
unless:设置是否启用缓存,如果为True,不启用缓存
forced_update:设置缓存是否实时更新,如果为True,无论是否过期都将更新缓存
query_string:为True时,缓存键是先将参数排序然后哈希的结果
cache.memoize:装饰器,装饰有参数函数,使得该函数结果可以缓存
make_name:设置函数的标志,如果没有就使用装饰的函数
# 其他参数同cached
cache.delete_memoized:删除缓存
参数:
fname:缓存函数的名字或引用
*args:函数参数
cache.clear() # 清除缓存所有的缓存,这个操作需要慎重
cache.cache # 获取缓存对象
#获取某个网页是否存在缓存,key值如'view//gbook.html'
cache.cache.has('view/{}'.format(request.path))
#打印该缓存
print(request.path,cache.get('view/{}'.format(request.path)))
#删除该缓存
cache.delete('view//gbook.html')

5. 显示缓存存储

利用cache.getcache.set方法

from flask import Flask, request , render_template_string
from flask_caching import Cache  
app = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE': 'simple'})
@app.route("/html")  
@app.route("/html/<foo>")  
def html(foo=None):  
    if foo is not None:  
       cache.set("foo", foo)  
       bar = cache.get("foo")  
    return render_template_string(  
    "<html><body>foo cache: {{bar}}</body></html>", bar=bar  
    )
if __name__ == '__main__':
   app.run(host='0.0.0.0')  

执行python cache1.py, 访问:http://127.0.0.1:5000/html/hello

foo cache: hello

6. 缓存20秒效果

使用装饰器 cached() 能够缓存等待

#---coding:utf-8
from flask import Flask, request  
from flask_caching import Cache  
app = Flask(__name__)  
# simple使用字典存储  
cache = Cache(app, config={'CACHE_TYPE': 'simple'})  
@app.route('/index')  
@cache.cached(timeout=20)  
def index():  
    print(request.path)  
    s = 'test cache'  
    cache.set('b',123)  
    print('test cache')  
    return s  
@app.route('/test')  
def test():  
    print(cache.get('b'))  
    return 'ok'  
if __name__ == '__main__':  
   app.run(host='0.0.0.0')  

执行python cache2.py ,访问:http://127.0.0.1:5000/index

界面输出,多次刷新

test cache

日志输出:

test cache
192.168.211.1 - - [09/Jul/2020 18:59:39] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:42] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:43] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:43] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:46] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:47] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:49] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:49] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:51] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:52] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:53] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:54] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:55] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:56] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:56] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:57] "GET /index HTTP/1.1" 200 -
192.168.211.1 - - [09/Jul/2020 18:59:58] "GET /index HTTP/1.1" 200 -
/index
test cache
192.168.211.1 - - [09/Jul/2020 18:59:59] "GET /index HTTP/1.1" 200 -

访问http://127.0.0.1:5000/test,多次刷新

界面输出:ok

日志输出:

123
192.168.211.1 - - [09/Jul/2020 19:01:27] "GET /test HTTP/1.1" 200 -
123
192.168.211.1 - - [09/Jul/2020 19:01:27] "GET /test HTTP/1.1" 200 -
123
192.168.211.1 - - [09/Jul/2020 19:01:27] "GET /test HTTP/1.1" 200 -
123
192.168.211.1 - - [09/Jul/2020 19:01:28] "GET /test HTTP/1.1" 200 -

参考:


FLASK插件之使用FLASK_CACHING缓存

linux python web flask Hello World实战

windows python web flask Hello World实战

windows python web flask 模板开放实战

windows python web flask获取请求参数数据

windows python flask返回json数据

windows python flask与mysql数据库写入查询显示等操作详解


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2天前
|
数据采集 Web App开发 JavaScript
python-selenium模块详解!!!
Selenium 是一个强大的自动化测试工具,支持 Python 调用浏览器进行网页抓取。本文介绍了 Selenium 的安装、基本使用、元素定位、高级操作等内容。主要内容包括:发送请求、加载网页、元素定位、处理 Cookie、无头浏览器设置、页面等待、窗口和 iframe 切换等。通过示例代码帮助读者快速掌握 Selenium 的核心功能。
17 5
|
1天前
|
JSON API 数据格式
如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架
本文介绍了如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架,适合小型项目和微服务。文章从环境准备、创建基本Flask应用、定义资源和路由、请求和响应处理、错误处理等方面进行了详细说明,并提供了示例代码。通过这些步骤,读者可以快速上手构建自己的RESTful API。
7 2
|
3天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
12 1
|
3天前
|
JSON API 数据格式
构建RESTful APIs:使用Python和Flask
构建RESTful APIs:使用Python和Flask
11 1
|
3天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
8 1
|
1天前
|
Python
SciPy 教程 之 SciPy 模块列表 16
SciPy教程之SciPy模块列表16 - 单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了力学单位的使用,如牛顿、磅力和千克力等。
4 0
|
1天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy 教程之 SciPy 模块列表 15 - 功率单位。常量模块包含多种单位,如公制、质量、时间等。功率单位中,1 瓦特定义为 1 焦耳/秒,表示每秒转换或耗散的能量速率。示例代码展示了如何使用 `constants` 模块获取马力值(745.6998715822701)。
6 0
|
1天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy教程之SciPy模块列表15:单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。功率单位以瓦特(W)表示,1W=1J/s。示例代码展示了如何使用`constants`模块获取马力(hp)的值,结果为745.6998715822701。
7 0
|
3天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy 教程之 SciPy 模块列表 13 - 单位类型。常量模块包含多种单位:公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例:`constants.zero_Celsius` 返回 273.15 开尔文,`constants.degree_Fahrenheit` 返回 0.5555555555555556。
6 0
|
4天前
|
Python
SciPy 教程 之 SciPy 模块列表 11
SciPy教程之SciPy模块列表11:单位类型。常量模块包含公制单位、质量单位、角度换算、时间单位、长度单位、压强单位、体积单位、速度单位、温度单位、能量单位、功率单位、力学单位等。体积单位示例展示了不同体积单位的换算,如升、加仑、流体盎司、桶等。
8 0