redis系列之-更新问题解决方案
redis做缓存减轻mysql数据库压力的同时,更新会产生双库数据不一致的情况,我这里采取的方案是:
mysql更新数据后,删除redis缓存(这也是大多数企业采用的),用户下次访问时没有命中缓存,会去访问mysql,并产生新的redis缓存.
虽然在大多数情况下是安全的,但并不是绝对安全,也会产生不一致情况,所以要进行定时数据校正.
策略:
先到mysql中查询数据
删除redis中的数据
将mysql中的数据写入redis
1.1设置定时任务
这里为了方便大家理解,我放的项目初始化的代码,你只需要看定时任务注册就好
from apscheduler.executors.pool import ThreadPoolExecutor
from apscheduler.schedulers.background import BackgroundScheduler
from flask import Flask
from schedule.statistic import fix_statistic
def create_flask_app(config, enable_config_file=False):
"""
创建Flask应用
"""
app = Flask(__name__)
app.config.from_object(config)
if enable_config_file:
from utils import constants
# 加载隐私配置
app.config.from_envvar(constants.GLOBAL_SETTING_ENV_NAME, silent=True)
return app
def create_app(config, enable_config_file=False):
"""
创建flask应用 并 初始化各组件
:param config: 配置类
:param enable_config_file: 是否允许运行环境中的配置文件覆盖已加载的配置信息
:return: flask应用
"""
app = create_flask_app(config, enable_config_file)
# 添加自定义正则转换器
from utils.converters import register_converters
register_converters(app)
# 创建redis哨兵
from redis.sentinel import Sentinel
_sentinel = Sentinel(app.config['REDIS_SENTINELS'])
# 获取redis主从连接对象
app.redis_master = _sentinel.master_for(app.config['REDIS_SENTINEL_SERVICE_NAME'])
app.redis_slave = _sentinel.slave_for(app.config['REDIS_SENTINEL_SERVICE_NAME'])
# 创建redis集群
from rediscluster import StrictRedisCluster
app.redis_cluster = StrictRedisCluster(startup_nodes=app.config['REDIS_CLUSTER'])
# 配置myql数据库
from models import db
db.init_app(app)