当一个资源需要从服务器中获取,并且资源比较庞大,服务器可能处理起来比较慢,并且此功能为热门功能,可能用户需要经常访问获取。此时,服务器就可以考虑缓存技术。缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。接下来将记录一下如何缓存一个Flask的请求,并且记录一下Flask的缓存扩展库Flask-Cache
:
pip install flask-cache
当我们安装好了Flask-Cache
模块时,我们还需要对其进行实例化,并进行相应的配置:
from flask import Flask
from flask_cache import Cache
app = Flask(__name__)
cache = Cache(app,config={
"CACHE_TYPE":"simple"
})
也可以使用init_app()
方法稍后设置你的实例:
app = Flask(__name__)
cache = Cache(config={
"CACHE_TYPE":"simple"
})
cache.init_app(app)
或者也可以这样:
app = Flask(__name__)
cache = Cache()
cache.init_app(app,config={
"CACHE_TYPE":"simple"
})
要缓存视图函数,你可以使用@cache.cached()
装饰器,这个装饰器默认使用request.path作为cache_key:
@app.route("/get_info")
@cache.cached()
def get_info():
print "no cache"
return "it is ok!"
@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)
在@cache.memoize()
装饰器中,函数的参数也包含在cache_key中:
@cache.memoize(timeout=30)
def sum_data(a,b):
return int(a) + int(b)
值得注意的是,对于不接收参数的函数来说,@cache.memoize()
与@cache.cached()
是一样的
以下是一个用于清除应用程序缓存的示例脚本:
from manager import app,cache
with app.app_context():
cache.clear()
Flask-Cache
支持多个类型作为缓存后端,不同的缓存后端,配置项也不尽相同,接下来记录一下Flask-Cache
支持的缓存后端:
配置 | 说明 |
---|---|
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服务器作为缓存后端,支持pylibmc
或memcache
或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_HOST | redis地址 |
CACHE_REDIS_PORT | redis端口 |
CACHE_REDIS_PASSWORD | redis密码 |
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()
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 | 可选字典在缓存类实例化期间传递 |