缓存一致性的设计

时间: 2019-07-11阅读: 28标签: 缓存

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


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

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

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

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 的模式;或者强制读主库取数据;


四、小结

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

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

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


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

Node.js中的code cache

V8使用JIT去解析JS,在JS代码执行之前,首先要消耗大量的时间在解析和编译中,这会拖慢JS的总执行时间,在2015年V8支持了code cache方案来解决这个问题。

浏览器端的九大缓存

浏览器缓存是浏览器端保存数据用于快速读取或避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求和浏览器快速地读取本地数据,整体上加速网页展示给用户。浏览器端缓存的机制种类较多,总体归纳为九种

关于SbWebServer页面缓存的设计

对于一个网站页面来说,不同的页面被访问的可能性不同,像主页被访问的概率是最大的。如果利用这个特点,对高访问概率的页面存入缓存,这样每次连接过来就不用每次都要经历本地找文件,打开这样一个过程

html强制清缓存

。在开发时候经常遇到一个问题,我们根据版本号去控制缓存问题,当我们发布新版本,使用心得版本号的时候,发现html里面引用的版本号却是旧的版本号 ,原来是该html文件被缓存了,很多时候我们设置禁止html文件被缓存,但依然会出现被缓存的情况。

给url加时间戳,骗过浏览器缓存

修改js的时候总是因为浏览器不刷新缓存,导致修改无效。URL后面添加随机数通常用于防止客户端(浏览器)缓存页面。 浏览器缓存是基于url进行缓存的,如果页面允许缓存

清除浏览器缓存的方法

怎么清除浏览器缓存,比如每次进入页面后先清理上次浏览器缓存的html,css,js ? 直接在html页面的head标签中添加,当然这个需要浏览器支持, 不想缓存静态文件,

缓存的三大问题

业务系统访问压根就不存在的数据,就称为缓存穿透。缓存因某种原因发生了宕机,那么原本被缓存抵挡的海量查询请求就会像疯狗一样涌向数据库。 此时数据库如果抵挡不了这巨大的压力,它就会崩溃。这就是缓存雪崩

localstorage实现带过期时间的缓存功能

一般可以使用cookie,localstorage,sessionStorage来实现浏览器端的数据缓存,减少对服务器的请求。cookie数据存放在本地硬盘中,只要在过期时间之前,都是有效的,即使重启浏览器。

抽离css以及公共js

分离css:为何要把 CSS 文件分离出来,而不是直接一起打包在 JS 中。当我们考虑更好地利用缓存来加速静态资源访问时,会尝试把一些公共资源单独分离开来,利用缓存加速,以避免重复的加载

浏览器的缓存策略

已开始生产的项目,用户每次刷新的时候大多数与上次请求的数据一致。那么服务器端的数据没有更新,客户端也没有必要每次都去服务器端拉取数据,占用服务器的带宽。这时候需要前端的静态文件缓存机制。以下以nginx配置为例

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

广告赞助文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全