标签: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