当前位置: 首页 > 工具软件 > Py3Cache > 使用案例 >

Flask-Cache的使用

国跃
2023-12-01

当一个资源需要从服务器中获取,并且资源比较庞大,服务器可能处理起来比较慢,并且此功能为热门功能,可能用户需要经常访问获取。此时,服务器就可以考虑缓存技术。缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。接下来将记录一下如何缓存一个Flask的请求,并且记录一下Flask的缓存扩展库Flask-Cache

安装

pip install flask-cache
  • 1

初始化

当我们安装好了Flask-Cache模块时,我们还需要对其进行实例化,并进行相应的配置:

from flask import Flask
from flask_cache import Cache

app = Flask(__name__)
cache = Cache(app,config={
    "CACHE_TYPE":"simple"
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

也可以使用init_app()方法稍后设置你的实例:

app = Flask(__name__)
cache = Cache(config={
    "CACHE_TYPE":"simple"
})
cache.init_app(app)
  • 1
  • 2
  • 3
  • 4
  • 5

或者也可以这样:

app = Flask(__name__)
cache = Cache()
cache.init_app(app,config={
    "CACHE_TYPE":"simple"
})
  • 1
  • 2
  • 3
  • 4
  • 5

缓存视图函数

要缓存视图函数,你可以使用@cache.cached()装饰器,这个装饰器默认使用request.path作为cache_key:

@app.route("/get_info")
@cache.cached()
def get_info():
    print "no cache"
    return "it is ok!"
  • 1
  • 2
  • 3
  • 4
  • 5

@cache.cached()装饰器还可以接收参数,如参数timeout设置缓存过期时间;参数unless接收一个Bool类型的值,如果设置为True将不会使用缓存机制;参数key_prefix替换默认的cache_key

缓存其他函数

使用@cache.cached()装饰器可以缓存其它非视图相关函数的结果,当使用@cache.cached()装饰器缓存非视图相关函数的结果时,建议传入参数key_prefix来替换默认的cache_key,否则它将会默认使用request.path作为cache_key:

@cache.cached(timeout=30,key_prefix="aaa")
def sum_data(a,b):
    return int(a) + int(b)
  • 1
  • 2
  • 3

memoize()

@cache.memoize()装饰器中,函数的参数也包含在cache_key中:

@cache.memoize(timeout=30)
def sum_data(a,b):
    return int(a) + int(b)
  • 1
  • 2
  • 3

值得注意的是,对于不接收参数的函数来说,@cache.memoize()@cache.cached()是一样的

清除缓存

以下是一个用于清除应用程序缓存的示例脚本:

from manager import app,cache

with app.app_context():
    cache.clear()
  • 1
  • 2
  • 3
  • 4

配置

Flask-Cache支持多个类型作为缓存后端,不同的缓存后端,配置项也不尽相同,接下来记录一下Flask-Cache支持的缓存后端:

  • null:无缓存。相关配置项如下:
配置说明
CACHE_ARGS在缓存类实例化过程中解包和传递的可选列表
CACHE_OPTIONS可选字典在缓存类实例化期间传递

simple:使用本地python字典进行存储,这不是线程安全的。相关配置项如下:

配置说明
CACHE_DEFAULT_TIMEOUT默认过期/超时时间,单位为秒
CACHE_THRESHOLD缓存的最大条目数
CACHE_ARGS在缓存类实例化过程中解包和传递的可选列表
CACHE_OPTIONS可选字典在缓存类实例化期间传递

filesystem:使用文件系统来存储缓存的值。相关配置项如下:

配置说明
CACHE_DEFAULT_TIMEOUT默认过期/超时时间,单位为秒
CACHE_DIR存储缓存的目录
CACHE_THRESHOLD缓存的最大条目数
CACHE_ARGS在缓存类实例化过程中解包和传递的可选列表
CACHE_OPTIONS可选字典在缓存类实例化期间传递

memcached:使用memcached服务器作为缓存后端,支持pylibmcmemcache或Google应用程序引擎memcache库。相关配置项如下:

配置说明
CACHE_DEFAULT_TIMEOUT默认过期/超时时间,单位为秒
CACHE_KEY_PREFIX设置cache_key的前缀
CAHCE_MEMCACHED_SERVERS服务器地址的列表或元组
CACHE_ARGS在缓存类实例化过程中解包和传递的可选列表
CACHE_OPTIONS可选字典在缓存类实例化期间传递

redis:使用Redis作为缓存后端。相关配置项如下:

配置说明
CACHE_DEFAULT_TIMEOUT默认过期/超时时间,单位为秒
CACHE_KEY_PREFIX设置cache_key的前缀
CACHE_REDIS_HOSTredis地址
CACHE_REDIS_PORTredis端口
CACHE_REDIS_PASSWORDredis密码
CACHE_REDIS_DB使用哪个库
CACHE_REDIS_URL连接到Redis服务器的URL。示例redis://user:password@localhost:6379/2
CACHE_ARGS在缓存类实例化过程中解包和传递的可选列表
CACHE_OPTIONS可选字典在缓存类实例化期间传递

举个栗子:

from flask import Flask
from flask_cache improt Cache

app = Flask(__name__)
cache = Cache(app,config={
    "CACHE_TYPE":"redis",
    "CACHE_REDIS_HOST":"192.168.0.158",
    "CACHE_REDIS_PORT":6379,
    "CACHE_REDIS_PASSWORD":"123456",
    "CACHE_REDIS_DB":2
})

@app.route("/get_info")
@cache.cached(timeout=30)
def get_info():
    print "no cache!"
    return "it is ok!"

if __name__ == "__main__":
    app.run()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • saslmemcached:使用memcached服务器作为缓存后端,打算与支持SASL的连接一起使用到memcached服务器。pylibmc是必须的,SASL必须由libmemcached支持。相关配置项如下:
配置说明
CACHE_DEFAULT_TIMEOUT默认过期/超时时间,单位为秒
CACHE_KEY_PREFIX设置cache_key的前缀
CAHCE_MEMCACHED_SERVERS服务器地址的列表或元组
CACHE_MEMCACHED_USERNAME使用memcached进行SASL认证的用户名
CACHE_MEMCACHED_PASSWORD使用memcached进行SASL认证的密码
CACHE_ARGS在缓存类实例化过程中解包和传递的可选列表
CACHE_OPTIONS可选字典在缓存类实例化期间传递
 类似资料: