zoukankan      html  css  js  c++  java
  • 引入缓存后数据一致性的思考

    在项目中经常碰到由于数据库的压力过大,引入缓存的情况。引入缓存后系统会比单独访问缓存复杂很多,本文就缓存的更新进行分析。

    一、为什么引入缓存

    何为缓存,简单点就是应用系统和数据库之间的一个存储介质。和计算机中CPU和内存之间的关系,我们知道CPU的速度很快,内存相比于数据库会慢很多,为了解决这个问题,引入了高速缓存,作为连接CPU和内存的桥梁,前提是高速缓存的读取/写入速度要比内存高很多,这样才有意义。下面看未引入缓存前的数据读取方式。

    从上图可以看到未引入缓存的访问流程就是用户发起请求到业务系统,业务系统访问数据。在并发不高的单系统中这样勉强是可以的,但是一旦有并发,势必会造成数据库的瓶颈,所以我们要引入缓存。

    二、引入缓存的好处

    上面分析随着业务系统访问的增多,数据库会形成访问瓶颈,要解决这个问题其实可以有以下几个方案,

    1、数据库做主从,实现读写分离,主负责写,从负责读;

    2、使用队列限制访问数据库的线程数;

    上面仅是几种方案,但都存在问题,第一种方案由于是主从,会存在主从延迟的问题,对数据实时性要求不高的场景是可以的,另外主从可能存在单点故障(做双主模式);第二种虽然使用了队列限制,但是牺牲了用户体验,导致用户的访问会等待。下面就要引入要说的缓存,可以把部分热点数据放在缓存中,既能减轻数据的压力,又可以提高用户体验。

    1、读取数据

    引入缓存后的数据流向如下,

    访问流程如下,

    1、用户查询数据,先访问缓存,如果存在缓存中,则直接返回,如果不存在进入下一步;

    2、查询数据,得到要查询的数据,把数据写到缓存中,同时返回给用户;

    2、更新数据

    引入缓存后的更新数据流程如下,

    1、更新数据库;

    2、更新缓存;

    三、引入缓存后的问题

    引入缓存后增加了系统的复杂度,同时会带来一些潜在的问题,最大的问题即数据不一致。

    1、读取流程存在的问题

    由于所有的查询都先查询缓存,缓存不存在时才会查询数据,如果所有的缓存均不命中,那么查询就会全部涌向数据库;

    如果缓存写入失败,那么下次再查询相同的数据又会查询数据库,所以写入缓存是重点保障的业务;

    2、更新流程存在的问题

    由于是先更新数据库,在更新缓存,如果缓存更新失败,那么会造成缓存和数据库的不一致,这个不一致可以通过以下方式解决

    1、更新缓存时采用先删除再写入的方式进行,即使删除成功未写入也是数据库中有数据,缓存中没有数据;也存在删除不成功的情况;

    以上是就引入缓存后的一些思考,后面会针对数据不一致作分析。

    有不正之处,欢迎指正,感谢!

  • 相关阅读:
    fescar源码解析系列(一)之启动详解
    dubbo源码解析二 invoker链
    dubbo源码解析一
    CSP-S 2021 游记
    使用SpEL记录操作日志的详细信息
    Router 重定向和别名是什么?
    vue项目做seo(prerender-spa-plugin预渲染)
    vue3.0初体验有哪些实用新功能
    uniapp弹窗踩坑
    Spring boot application.properties 配置
  • 原文地址:https://www.cnblogs.com/teach/p/10939898.html
Copyright © 2011-2022 走看看