Flask 框架中使用 Redis (三)
2021-12-31 by dongnan
环境描述
详细环境信息请参考以下文章:
接下来用一个实际例子介绍在 Flask
框架中使用 Redis
缓存 。
举个栗子
这里 redis
用于存储计算过的数据,原因如下:
- 数据较多、每次计算的时间较长,造成网站页面加载缓慢的问题。
- 重复计算,造成服务器操作系统负载较高问题。
希望将数据计算的结果保存在 redis
一段时间,逻辑如下:
- 如果缓存数据(
TTL
)在有效期内,则直接读取redis
服务器中的数据。 - 如果在缓存数据过期,则重新计算一次并将结果保存在
redis
服务器。
某些情况下虽然缓存没有过期,但是因为数据变更,需要主动更新 reids
缓存,所以需要一个更新缓存的接口。
代码
flask
视图函数部分代码:
# -*- coding: utf-8 -*-
from flask import Blueprint, render_template, request, flash, redirect, url_for, current_app
from app.extensions import db, redis_client
from app.utils import use_of_cache, chart_data_of_indexes, this_year_data_of_indexes
# 省略...
import datetime, json, os
# Redis TTL
ttl_this_year_yield = 60 * 60 * 12
index_bp = Blueprint('indexes', __name__)
@index_bp.route('/indexes/index')
def index():
"""
指数历史数据与指数年内数据,均从redis缓存内读取。
"""
# 主动更新缓存
arg = request.args.get('cache', None)
use_cache = use_of_cache(arg)
# 指数历史数据
index_chart_data = redis_client.get('index_chart_data')
if index_chart_data:
chart_data = json.loads(index_chart_data)
else:
chart_data = chart_data_of_indexes()
# 存储redis TTL=3600
redis_client.set('index_chart_data', json.dumps(chart_data), 3600)
# 指数年内数据
index_yield_this_year = redis_client.get('index_yield_this_year')
if index_yield_this_year and use_cache:
extra_data = json.loads(index_yield_this_year)
else:
extra_data = this_year_data_of_indexes()
# 存储redis
redis_client.set('index_yield_this_year', json.dumps(extra_data), ttl_this_year_yield)
return render_template('indexes/index.html', chart_data=chart_data, extra_data=extra_data)
说明
chart_data_of_indexes
函数用于计算指数历史数据(图表数据)。this_year_data_of_indexes
函数用于计算指数年内波动数据。use_of_cache
函数用于判断是否更新缓存。
验证
第一次访问页面,因为要计算数据,时间相对较慢,并把数据保存在redis
:
telnet 192.168.xx.250 6379
Trying 192.168.xx.250...
Connected to 192.168.xx.250.
Escape character is '^]'.
auth ThisPassword # 密码
+OK
keys * # 全部key
*2
$21
index_yield_this_year
$16
index_chart_data
get index_yield_this_year # 获得数据
$209
{"000905": -8.08, "000300": -6.46, "000922": -0.98, "000932": -6.2, "000827": -10.81, "000986": 3.44, “399971": -15.85, "000985": -7.85, "000991": -13.41, ”HSI": 5.51}
ttl index_chart_data # 获得TTL时间
:2654
quit # 退出
+OK
Connection closed by foreign host.
当使用redis
缓存后页面加载速度起飞: