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

安装flask_caching库:

pip install flask_caching

缓存类型

flask-caching内置的缓存类型CACHE_TYPE有:NullCache、SimpleCache、FileSystemCache、RedisCache、RedisSentinelCache、RedisClusterCache、UWSGICache、MemcachedCache、SASLMemcachedCache和SpreadSASLMemcachedCache(在Flask-Caching2.0中删除)。

NullCache:无缓存,其配置参数可以有:

  • CACHE_NO_NULL_WARNING:不会抛出警告信息;
  • CACHE_DEFAULT_TIMEOUT:如果未指定超时,则使用默认超时,时间单位是秒。

SimpleCache:使用本地python字典进行存储,非线程安全,其配置参数可以有:

  • CACHE_DEFAULT_TIMEOUT:如果未指定超时,则使用默认超时,时间单位是秒;
  • CACHE_THRESHOLD:最大缓存数;
  • CACHE_IGNORE_ERRORS:其值为True时,在删除过程中发生的任何错误将被忽略;其值为False时,在删除过程中第一个错误时停止删除;

FileSystemCache:使用文件系统来存储缓存的值,其配置参数可以有:

  • CACHE_DEFAULT_TIMEOUT:如果未指定超时,则使用默认超时,时间单位是秒;
  • CACHE_IGNORE_ERRORS:其值为True时,在删除过程中发生的任何错误将被忽略;其值为False时,在删除过程中第一个错误时停止删除;
  • CACHE_DIR:存储缓存的目录;
  • CACHE_THRESHOLD:最大缓存数;
  • CACHE_OPTIONS:在缓存类实例化期间传递的可选字典。

RedisCache:使用Redis作为缓存后端,其配置参数可以有:

  • CACHE_DEFAULT_TIMEOUT:如果未指定超时,则使用默认超时,时间单位是秒;
  • CACHE_KEY_PREFIX:所有它都可以用于应用程序的应用程序使用相同的键;
  • CACHE_OPTIONS:在缓存类实例化期间传递的可选字典;
  • CACHE_REDIS_HOST:Redis 服务器主机;
  • CACHE_REDIS_PORT:Redis 服务器端口,默认为 6379;
  • CACHE_REDIS_PASSWORD:服务器的 Redis 密码;
  • CACHE_REDIS_DB :Redis db(从零开始的数字索引),默认为 0;
  • CACHE_REDIS_URL:| 连接到 Redis 服务器的 URL,例子redis://user:password@localhost:6379/2 。

RedisSentinelCache:使用Redis哨兵模型缓存,其配置参数可以有:

  • CACHE_KEY_PREFIX:所有它都可以用于应用程序的应用程序使用相同的键;
  • CACHE_REDIS_SENTINELS:Redis哨兵地址的列表或元组;
  • CACHE_REDIS_SENTINEL_MASTER:哨兵配置中的主服务器的名称
  • CACHE_REDIS_PASSWORD:服务器的 Redis 密码;
  • CACHE_REDIS_DB:Redis db(从零开始的数字索引),默认为 0。

RedisClusterCache:使用Redis自动分区缓存,其配置参数可以有:

  • CACHE_KEY_PREFIX:所有它都可以用于应用程序的应用程序使用相同的键;
  • CACHE_REDIS_CLUSTER:一串以逗号分隔的 Redis 集群节点地址;
  • CACHE_REDIS_PASSWORD:服务器的 Redis 密码。

MemcachedCache:使用memcached服务器作为缓存后端,支持pylibmc或memcache或Google应用程序引擎memcache库,其配置参数可以有:

  • CACHE_DEFAULT_TIMEOUT:如果未指定超时,则使用默认超时,时间单位是秒;
  • CACHE_KEY_PREFIX:所有它都可以用于应用程序的应用程序使用相同的键;
  • CACHE_MEMCACHED_SERVERS:服务器地址的列表或元组。
  • 注意:Flask-Caching不会将额外的配置选项传递给memcached后端,要向这些缓存添加其他配置。

SASLMemcachedCache:启用SASL的memcached服务器作为缓存后端,其配置参数可以有:

  • CACHE_DEFAULT_TIMEOUT:如果未指定超时,则使用默认超时,时间单位是秒;
  • CACHE_KEY_PREFIX:所有它都可以用于应用程序的应用程序使用相同的键;
  • CACHE_OPTIONS:在缓存类实例化期间传递的可选字典;
  • CACHE_MEMCACHED_SERVERS:服务器地址的列表或元组;
  • CACHE_MEMCACHED_USERNAME:使用memcached进行SASL身份验证的用户名;
  • CACHE_MEMCACHED_PASSWORD:使用memcached进行SASL身份验证的密码。

UWSGICache:使用uwsgi服务器作为缓存,其配置参数可以有:

  • CACHE_UWSGI_NAME:要连接的uwsgi缓存实例的名称,例如:mycache @ localhost :3031,默认为空字符串;

注意:该UWSGICache没有维护也没有测试,不建议使用。

配置参数

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

初始化

以缓存类型为RedisCache为例:

from flask import Flask
from flask_caching import Cache
import time# 配置RedisCache缓存类型参数值,使用本地的redis,没有密码
config = {'CACHE_TYPE': 'redis',  # 使用redis作为缓存'CACHE_REDIS_HOST': '127.0.0.1',  # redis地址'CACHE_REDIS_PORT': 6379  # redis端口号
}
# simple
# cache = Cache(app, config={'CACHE_TYPE': 'simple'})app = Flask(__name__)# 初始化缓存
cache = Cache(app=app, config=config)  # 创建Cache对象# 或使用init_app()初始化缓存
# cache = Cache()         # 创建Cache对象
# cache.init_app(app=app, config=config)@app.route('/')
def index():return 'hello world!'if __name__ == '__main__':app.run()

Cache对象的主要方法有:

#装饰器,装饰无参数函数,缓存该函数
@cache.cached(timeout=None, key_prefix=None, unless=None, forced_update=None, query_string=False)

其中:timeout为超时时间;

可选参数有:

  • key_prefix:缓存指定的函数;
  • unless:是否启用缓存,如果为True,不启用缓存;
  • forced_update:缓存是否实时更新,如果为True,无论是否过期都将更新缓存;
  • query_string:为True时,缓存键是先将参数排序然后哈希的结果。
#装饰器,装饰有参数函数,缓存该函数
@cache.memoize(timeout=None, make_name=None, unless=None, forced_update=None, query_string=False)

与cache.cached()方法类似,区别为cache.memoize有make_name,其作用是设置函数的标志,如果没有就使用装饰的函数。

使用缓存

为了能更好地体现效果,通过设置休眠时间来模拟数据加载时间。

示例代码:

from flask import Flask
from flask_caching import Cache
import time# 配置RedisCache缓存类型参数值,使用本地的redis,没有密码
config = {'CACHE_TYPE': 'redis',  # 使用redis作为缓存'CACHE_REDIS_HOST': '127.0.0.1',  # redis地址'CACHE_REDIS_PORT': 6379  # redis端口号
}app = Flask(__name__)# 初始化缓存
cache = Cache(app=app, config=config)  # 创建Cache对象# 或使用init_app()初始化缓存
# cache = Cache()         # 创建Cache对象
# cache.init_app(app=app, config=config)@app.route('/')
@cache.cached(timeout=200)  # 设置超时时间
def index():time.sleep(5)return 'hello world!'if __name__ == '__main__':app.run()

在缓存对象中,我们可以使用以下代码来设置、获取、删除缓存对象:

# 设置
cache.set(key, value, timeout=None)  # 设置一个缓存对象
cache.set_many({key: value, key: value, ..., key: value}, timeout=None)  # 设置多个缓存对象
# 获取
cache.get(key)  # 获取一个缓存对象
cache.get_many(key1, key2, ....)  # 获取多个缓存对象
# 删除
cache.get.delete(key)  # 删除一个缓存对象
cache_delete_many(key1, key2, ...)  # 删除多个缓存对象
cache.clear()  # 删除所有缓存对象

示例代码:

from flask import Flask
from flask_caching import Cache# 配置RedisCache缓存类型参数值,使用本地的redis,没有密码
config = {'CACHE_TYPE': 'redis',  # 使用redis作为缓存'CACHE_REDIS_HOST': '127.0.0.1',  # redis地址'CACHE_REDIS_PORT': 6379  # redis端口号
}app = Flask(__name__)# 初始化缓存
cache = Cache(app=app, config=config)  # 创建Cache对象# 或使用init_app()初始化缓存
# cache = Cache()         # 创建Cache对象
# cache.init_app(app=app, config=config)@app.route('/')
def index():cache.set('name', '王五', timeout=30)  # 设置键为name,value为小明,超时时间为30秒的缓存对象print(cache.get('name'))  # 打印键为name的缓存对象值cache.set_many({'name1': '李四', 'name2': '张三'}, timeout=30)  # 设置多个缓存对象print(cache.get_many("name1", "name2"))  # 打印多个缓存对象值print(cache.delete("name"))  # 删除键为name的缓存对象print(cache.delete_many("name1", "name2"))  # 删除多个缓存对象print(cache.get_many("name1", "name2"))  # 打印多个缓存对象值return '缓存对象'if __name__ == '__main__':app.run()

运行结果:

示例代码:

from flask import Flask, request
from flask_caching import Cacheapp = Flask(__name__)
# simple使用字典存储
cache = Cache(app, config={'CACHE_TYPE': 'simple'})@app.route('/')
@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()

运行结果:

更多flask_caching用法详见官方网址:Flask-Caching — Flask-Caching 1.0.0 documentation

python中flask_caching库用法详解(缓存)相关推荐

  1. python中os库用法详解(总结)

    os库主要是对文件和文件夹进行操作,在Python中对⽂件和⽂件夹的操作要借助os模块⾥⾯的相关功能. 具体步骤如下: 1. 导⼊os模块 import os 2. 使⽤ os 模块相关功能 os.函 ...

  2. python中dns库用法详解(DNS处理模块)

    dnspython是python 实现的一个dns场景的工具包. dnspython(http://www.dnspython.org/)是Python实现的一个DNS工具包,它支持几乎所有的记录类型 ...

  3. python中openpyxl库用法详解

    openpyxl模块是一个读写Excel 文档的Python库,openpyxl是一个比较综合的工具,能够同时读取和修改Excel文档. openpyxl.load_workbook(地址) - 打开 ...

  4. python中cpca库用法详解(从文本中提取省市区)

    一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块. 首先安装cpca库: pip install cpca Github: GitHub - DQinYuan/c ...

  5. python中IPy库用法详解

    使用python遍历所有的ip,可以借助第三方库IPy来获取所有的ip. 安装IPy库: pip install IPy 1.遍历IP网段中所有IP并打印个数 示例代码1: import IPydef ...

  6. python中ipaddress库用法详解

    ipaddress库提供了处理IPv4与IPv6网络地址的类.这些类支持验证,查找网络上的地址和主机,以及其他常见的操作. 示例代码1: import ipaddressx = ipaddress.i ...

  7. python中gzip库用法详解(压缩和解压缩)

    1.使用gzip创建一个文件: 示例代码: import gzip# 创建一个gzip文件 content = "Hello world!" f = gzip.open('file ...

  8. python中ipaddr库用法详解

    首先安装ipaddr库 pip install ipaddr 判断一个IP地址是否在某个网段内: import ipaddrip = ipaddr.IPv4Address("192.168. ...

  9. python中zlib库用法详解(压缩与解压缩)

    zlib主要用于压缩与解压缩 字符串:使用zlib.compress可以压缩字符串.使用zlib.decompress可以解压字符串. 数据流:压缩:compressobj,解压:decompress ...

最新文章

  1. C++中的内存对齐介绍
  2. ORACLE临时表空间
  3. 使用Jest测试JavaScript (入门篇)
  4. Spring Cloud @RefreshScope 原理是什么?
  5. [PAT乙级]1007 素数对猜想
  6. python中以表示语块_scikitlearn:将数据拟合成块与将其全部拟合到on
  7. 高性能MySQL(第二版)第三章 架构优化和索引(上)——读书笔记
  8. eclipse中常见快捷键
  9. 零基础学习.NET平台和Csharp编程开发
  10. 当前NLP迁移学习中的一些问题
  11. FAT32文件系统FAT表修复
  12. 超级好用的电脑截图翻译软件你值得拥有!
  13. Mark down学习日记
  14. shell脚本:介绍、语法、运算、流程控制、对文件/输出流处理、案例
  15. Unity3d 场景搭建 基础 学习
  16. mac 升级自带Python方法
  17. 让荣之学告诉你Shopee选品思路及运营方法!
  18. 想找Java项目练手,却不知道从哪找?
  19. 手撸架构,Nginx 面试40问
  20. Appium+Python appium启动夜神模拟器定位元素(三)

热门文章

  1. OpenCV SIFT源码详解——总体概览
  2. PESpin Plugin for ImpREC Version 1.0 by Nagareshwar Y Talekar
  3. 模拟乌龟吃鱼的小游戏
  4. (纯转载)一个真正符合中国国情的工作流设计参考(包括PHP实现)
  5. php如何制作301跳转,PHPWind论坛如何做301跳转
  6. 学习CSS3这一篇就够了
  7. springboot集成webservice发布
  8. sqlserver 2008R2 汉字转拼音问题
  9. SurfelMeshing 解析
  10. 高度决定视野,角度决定方向!