zoukankan      html  css  js  c++  java
  • 缓存和数据库不一致出现的原因及其解决

    cache与db不一致的原因,读与写出现并发。

    理论上,給cache设置过期时间,是保证最终一致性到解决方案。这种方案下,写操作以数据库为准。更新cache失败,只要到了过期时间,后面的读请求会从数据库中读取新值存入cache。不过,实际开发中只设过期时间不足以满足需求,出现3种策略。

    • 先更新DB,再更新cache
    • 先更新DB,再删除cache
    • 先删cache,再更新DB 

    对于第一种策略,开发中遇到比较少,原因如下:

    1. 如果写比读多,读取数据跟不上cache的频繁更新,浪费性能
    2. 如果DB的值需要经过一系列计算写入cache,每次更新DB,都要计算再写入cache,浪费性能

    后面2种策略,开发中体现以下几个场景:

    1. 先更新DB,再删除cache,删除cache失败
    2. 当删除完cache的时候,这时去更新DB,但还没有更新完,另外一个请求来查询数据,发现cache里没有,就去DB里查,再把DB旧数据存入缓存中

    解决方案:

    场景1

    1. 先删除cache,再更新DB,如果删除cache失败,就不更新DB。重试机制,删除cache。

    场景2

    1. 利用消息队列,更新cache

    DB产生新的增删改操作放入队列中,操作执行完发消息给cache,cache数据进行更新。如果中途出现查询,同步等待cache更新完成。

    详细资料可以参考:https://www.cnblogs.com/rjzheng/p/9041659.html

    通常做法:

    写数据只写DB

    更新数据,先更新DB;读数据,先读cache

    cache存热点数据

  • 相关阅读:
    jmeter中生成不重复的序列
    jmeter返回解密
    jmeter请求加密
    查看链接设备和安装软件
    jmeter_事物控制器_Transaction Controller
    jmeter返回中提取匹配多个参数($1$$2$)
    jmeter官方文档地址
    DEDECMS会员注册如何配置邮箱发送邮件功能
    颤抖吧,Css3
    html embed用法
  • 原文地址:https://www.cnblogs.com/ivy-xu/p/12357876.html
Copyright © 2011-2022 走看看