缓存一致性的设计

更新日期: 2019-07-11阅读: 1.8k标签: 缓存

数据库的热数据进行缓存是一种常见方案,但是如何保证缓存的数据和数据库的数据一致性呢?本文将进行详细的探讨。常见的设计有如下三种:


一、先更新数据库再更新缓存

数据库有对应操作的时候,则操作对应的缓存,即数据库插入,则缓存插入;数据库更新缓存更新;数据库删除,缓存删除。

此种方案常见于缓存的数据比较简单,不需要复杂计算的过程中。

1.1 优点

缓存不会miss, 命中率高。

1.2 缺点

并发写的情况下,可能导致缓存数据不一致。

并发写的情况下,如果两个请求分别更新了某条数据,在更新完数据库之后,此时需要更新缓存数据。由于网络传输的问题,此时更新数据库的请求 更新的缓存,便会导致缓存的数据存储的是第一次数据库更新之后的数据,导致数据不一致。因为缓存更新的时序应该和数据库更新的顺序一致。

因此对于高并发写操作的数据库业务不建议此方案。

1.3 改进事项

  • 需要保证缓存的执行顺序 和 数据库的执行顺序一致;同事也要避免长事务;


二、先删除缓存再操作数据库

当有更新操作的时候,先删除缓存,然后再更新数据库,如果查询缓存没有取到数据, 则重新读取数据库数据,根据该数据更新缓存。

2.1 优点

淘汰缓存策略操作简单,且通用;

2.2 缺点

  • 增加了一次cache miss
  • 并发读的情况下可能导致数据不一致

因此对于高并发读操作的数据库业务不建议此方案。

2.3 改进事项

  • cache miss 的情况下,读取数据库的数据时是否可以采用锁定读, 如 select for update 的模式;并且更新的时候将缓存更新封装到事务里面(注:不仅需要在事务里面,还需要在事务的 select for update 之后),否则依然可能由于时序的问题导致缓存数据不一致;


三、先更新数据库 再删除缓存

先更新数据库,再删除缓存即 Cache Aside Pattern;先更新数据库,再删除缓存, 如果查询缓存没有取到数据, 则重新读取数据库数据,根据该数据更新缓存。

3.1 优点

淘汰缓存策略操作简单,且通用;

3.2 缺点

高并发的情况下, 如果缓存不存在, 则重新读取数据库数据,根据该数据更新缓存;此时如果主从延迟,可能会从数据库读到历史的数据,依然导致缓存不一致。

3.3 改进事项

  • cache miss 的情况下,读取数据库的数据时是否可以采用锁定读, 如 select for update 的模式;或者强制读主库取数据;


四、小结

导致缓存数据不一致的因素主要有:

  • 高并发导致的,并发写 或者 并发读;
  • 数据库主从延迟;
  • 当然还有服务异常另当别论;

最后的最后使用缓存能显示的设置过期时间还是尽量设置过期时间吧,避免各种最终的不一致。


链接: https://www.fly63.com/article/detial/4637

浏览器缓存_HTTP强缓存和协商缓存

浏览器缓存主要分为强强缓存(也称本地缓存)和协商缓存(也称弱缓存),强缓存是利用http头中的Expires和Cache-Control两个字段来控制的,用来表示资源的缓存时间。协商缓存就是由服务器来确定缓存资源是否可用.

angularjs 缓存详解

一个缓存就是一个组件,它可以透明地存储数据,以便未来可以更快地服务于请求。缓存能够服务的请求越多,整体系统性能就提升得越多。

浏览器缓存问题原理以及解决方案

浏览器缓存就是把一个已经请求过的Web资源(如html页面,图片,js,数据等)拷贝一份副本储存在浏览器中,为什么使用缓存:减少网络带宽消耗,降低服务器压力,减少网络延迟,加快页面打开速度

Web缓存相关知识整理

一个H5页面在APP端,如果勾选已读状态,则下次打开该链接,会跳过此页面。用到了HTML5 的本地存储 API 中的 localStorage作为解决方案,回顾了下Web缓存的知识

使用缓存加速之后的网站访问过程变化

在描述CDN的实现原理之前,让我们先看传统的未加缓存服务的访问过程,以便了解CDN缓存访问方式与未加缓存访问方式的差别,用户访问未使用CDN缓存网站的过程为:用户向浏览器提供要访问的域名;

html页面清除缓存

页面打开时,由于缓存的存在,刚刚更新的数据有时无法在页面得到刷新,当这个页面作为模式窗口被打开时问题更为明显, 如何将缓存清掉?

HTTP之缓存 Cache-Control

通过在Response Header设置Cache-Control head 信息可以控制浏览器的缓存行为。我们先来看一下Cache-Control可以设置哪些值:缓存头Cache-Control只能在服务端设置,在客户端是由浏览器设置的,自己不能修改它的值。

工程化_前端静态资源缓存策略

增量更新是目前大部分团队采用的缓存更新方案,能让用户在无感知的情况获取最新内容。具体实现方式通常是(一般我们通过构建工具来实现,比如webpack):

前端静态资源自动化处理版本号防缓存

浏览器会默认缓存网站的静态资源文件,如:js文件、css文件、图片等。缓存带来网站性能提升的同时也带来了一些困扰,最常见的问题就是不能及时更新静态资源,造成新版本发布时用户无法及时看到新版本的变化,严重影响了用户体验。

vue后台管理系统解决keep-alive页面路由参数变化时缓存问题

一个后台管理系统,一个列表页A路由配置需要缓存,另一个页面B里面有多个跳转到A路由的链接。问题描述:首先访问/A?id=1页面,然后到B页面再点击访问A?id=2的页面,发现由于页面A设置了缓存,数据还是id=1的数据,并没有更新。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!