跳转至
  • 缓存主要用来缓解服务器压力最典型的是降低Mysql读操作次数
  • 服务中一般使用多级缓存,
  • 一级缓存: 本地层,存放在内存中(比如全局变量),但是如果数据量过大,服务中内存爆了反而会让服务器GG
  • 二级缓存: 使用Redis或者memcached等等来对最近从Mysql取出的数据进行缓存,后来再来的请求,会先从缓存中寻找资源,如果没人请求相同的资源,Redis中的资源会在我们指定时间内释放,如果Mysql中修改了数据,回对Redis中的缓存数据进行回填
  • 三级缓存: 同二级缓存, 只不过过期时间比二级缓存要长,二级缓存中没有的数据会会请求三级缓存,三级缓存如果也没有才会访问数据库 58071-0e9ftqdw90od.png

Flask中的缓存

  • SQLAlchemy起到一定的本地缓存作用:在同一请求中多次相同的查询只查询数据库一次SQLAlchemy做了本地缓存()类似Django中的Queryset查询结果集)
  • Flask-cache只对函数的响应进行缓存(底层是一个全局变量字典,不是线程安全),可以使视图,也可以是视图中调用的函数
  • 注意普通的路由使用缓存器的cached方法来装饰,动态路由需要memoize方法来装饰
  • 使用缓存器的cache._cache方法可以取出当前缓存内的数据
  • 安装
sudo pip install flask-cache
  • 使用时注意, 这个包的源码有问题,需要修改一下不然会有导入错误ImportError: No module named 'flask.ext' 77551-e94oklh04h5.png

26096-qvil63od65s.png

17915-v4zd4o2bruo.png 52587-mdzhivvak2.png

使用'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)