跳转至

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 缓存后页面加载速度起飞:

参考

回到页面顶部