- 缓存主要用来缓解服务器压力最典型的是降低Mysql读操作次数
- 服务中一般使用多级缓存,
- 一级缓存: 本地层,存放在内存中(比如全局变量),但是如果数据量过大,服务中内存爆了反而会让服务器GG
- 二级缓存: 使用Redis或者memcached等等来对最近从Mysql取出的数据进行缓存,后来再来的请求,会先从缓存中寻找资源,如果没人请求相同的资源,Redis中的资源会在我们指定时间内释放,如果Mysql中修改了数据,回对Redis中的缓存数据进行回填
- 三级缓存: 同二级缓存, 只不过过期时间比二级缓存要长,二级缓存中没有的数据会会请求三级缓存,三级缓存如果也没有才会访问数据库
Flask中的缓存¶
- SQLAlchemy起到一定的本地缓存作用:在同一请求中多次相同的查询只查询数据库一次SQLAlchemy做了本地缓存()类似Django中的Queryset查询结果集)
- Flask-cache只对函数的响应进行缓存(底层是一个全局变量字典,不是线程安全),可以使视图,也可以是视图中调用的函数
- 注意普通的路由使用缓存器的cached方法来装饰,动态路由需要memoize方法来装饰
- 使用缓存器的cache._cache方法可以取出当前缓存内的数据
- 安装
- 使用时注意, 这个包的源码有问题,需要修改一下不然会有导入错误
ImportError: No module named 'flask.ext'
使用'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
Demo¶
from flask import Flask
from flask.json import jsonify
from flask_cache import Cache
# 创建应用
app = Flask(__name__)
# 添加缓存类型
app.config['CACHE_TYPE'] = 'simple'
# 创建缓存器
cache = Cache(app=app)
# 创建应用并使用缓存
@app.route('/')
@cache.cached(timeout=300) # 设置缓存装饰器,timeout设置缓存过期时间
def index():
print('index', cache.cache._cache) # 取出缓存中的数据
return jsonify({'user_id':'zs'})
# 动态路由使用缓存
@app.route('/user/<int:user_id>')
@cache.memoize(timeout=300)
def user_info(user_id):
print('user_info', cache.cache._cache) # 取出缓存中的数据
return jsonify({'name':user_id})
# 自定义函数使用缓存
@app.route('/test')
@cache.cached(timeout=300)
def test():
test()
print('test', cache.cache._cache)
return jsonify({'func':"test"})
# 自定义函数使用缓存
@cache.cached(timeout=300)
def test():
return 'test'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)