码迷,mamicode.com
首页 > 数据库 > 详细

缓存与数据库一致性原则

时间:2020-11-18 13:22:46      阅读:30      评论:0      收藏:0      [点我收藏+]

标签:swap   技术   span   查找   读取   bsp   loading   图片   通过   

一、场景:

  两个用户发起下单请求,下单前需要查库存是否有剩余。

  用户甲 :1、阶段1 :访问缓存库存,获取到缓存库存数量为1;

      2、阶段1 :缓存数量为1,即有库存,准备更新,然后删除缓存库存;

      3、阶段3 :然后更新数据库库存为 0;

  用户乙:1、阶段2 :访问缓存库存,发现库存为空;

      2、阶段2:然后再去访问数据库(此时用户甲,还没有修改数据库,此时数据库库存数量为1),发现数据库存为1,然后写入缓存库存改为1 。 

  

技术图片

 

原因:  

  产生以上问题的原因是阶段2的时间长,延迟了用户甲在第三步的无法及时更新数据的库存数量的操作。

  阶段2,这段时间那么长,有以下原因。

  1、JVM垃圾收集的时候,会产生停止线程的场景。GC 产生 stop world

  2、操作系统的时候,有上下文切换,耗时较长;

  3、应用程序同步磁盘的时候,如果操作过程有是同步 io, 要等操作完成之后才能更新数据库;

  4、内存的 free 空间已经很小, 这时候会 swap 到持久化层面,这时候访问操作很久;

  5、操作更新数据库,由于网络的问题,包丢了;

  6、在操作的时候,有人在运维,就可以挂起虚拟机;

 

二、常见缓存访问模式

1、本地缓存(Cache-Aside)

  缓存不直接与数据库交互

  应用 服务1 访问数据库获取数据,再把数据存到本地缓存。

  技术图片

 

 

2、 缓存中间件(Cache-Aside)

2.1、第一种

  全链路

技术图片技术图片

 

2.1.1、读取缓存

  先访问缓存,查找数据;如果缓存返回失败,直接查找数据库,并放入缓存;

 

 

 2.2、第二种

  通过 统一数据访问服务,来决定先访问 数据库 还是 缓存,应用服务不直接访问数据库和缓存。

  应用服务通过 get 和 set 访问,具体的由 统一数据访问服务决定。

  技术图片

 

2.3、对比

  左边全链路的延迟更少,减少中间缓件。

  右边的应用服务逻辑更简单,对用户更友好。

  技术图片

 

 

 

三、一致性更新目标

  

 

缓存与数据库一致性原则

标签:swap   技术   span   查找   读取   bsp   loading   图片   通过   

原文地址:https://www.cnblogs.com/Jomini/p/13968603.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!