文档章节

缓存处理

一树梨花压海棠
 一树梨花压海棠
发布于 2016/09/14 11:28
字数 561
阅读 46
收藏 0

db then cache  or cahche then db?

  1、先更新/淘汰cahce然后更新db,如果在淘汰了cache,db未更新时,来了一条请求,由于缓存已经被淘汰,新来的请求将从数据库读取信息重新load到缓存,此时数据为脏数据,且以后的请求都是脏数据。

  2、先更新数据库然后更新/淘汰缓存,如果在更新db完成,缓存未更新时,来了一条请求,此请求读的事脏数据,但以后的请求全是新数据。

在不考虑cache和db操作失败的情况下,显然先更新db再更新cache更合适。那如果考虑其中一个更新失败了呢?

1、先更新db,如果cache失败,则请求读到的全是脏数据;

2、先更新(淘汰)cache,后续db操作失败。如果是更新缓存,db操作失败将导致缓存中的数据是脏数据。如果是淘汰缓存,db更新失败会导致一次cache miss(缓存穿刺)。

update cache or delete cache ?

写操作发生时,是更新缓存还是删除缓存呢。facebook在 Scaling Memcache at Facebook中使用的策略是更新数据库后删除memcache缓存。为什么是删除缓存而不是更新缓存呢?假设并发写更新完数据库后同时去更新缓存。此时两个写操作可能都从缓存中取到了数据A,此时将导致并发写导致脏数据。

并发写操作导致脏数据的情况是因为必须先从memcache中取出数据修改完在写回。但是在redis中,由于redis支持服务器操作,INCE,HINCR等操作都可以直接在服务器当中操作完成,对于这类操作不存在并发写的问题,因此可以选择更新db后更新缓存。直接update将减少一次cache miss

总结一下:在考虑了更新失败的情况下,分布式服务中并没有完美的解决方案,方法需要自己根据业务进行权衡,除非你愿意牺牲性能使用事务强一致性

 

© 著作权归作者所有

上一篇: db2 的递归
一树梨花压海棠
粉丝 1
博文 19
码字总数 3091
作品 0
潍坊
程序员
私信 提问
在.NET项目中使用PostSharp,使用CacheManager实现多种缓存框架的处理

在前面几篇随笔中,介绍了PostSharp的使用,以及整合MemoryCache,《在.NET项目中使用PostSharp,实现AOP面向切面编程处理》、《在.NET项目中使用PostSharp,使用MemoryCache实现缓存的处理》...

walb呀
2017/12/04
0
0
.NET缓存框架CacheManager在混合式开发框架中的应用(1)-CacheManager的介绍和使用

在我们开发的很多分布式项目里面(如基于WCF服务、Web API服务方式),由于数据提供涉及到数据库的相关操作,如果客户端的并发数量超过一定的数量,那么数据库的请求处理则以爆发式增长,如果...

walb呀
2017/12/04
0
0
JavaScript 和应用缓存

使用了JavaScript API的应用缓存可能是会有交互性的。这个API能够通过window.applicationCache去进行访问。 以下是API所支持的事件处理器: window.applicationCache.onchecking - 当浏览器去...

oschina
2013/04/23
1K
0
使用jfinal CacheKit有没有遇到我这种情况的?

1、数据查询并缓存 当没有缓存时,返回结果正常,debug返回结果显示为, 2、service中对查询结果处理,例如,勾选已选菜单 接下来问题就出在这里,当没有缓存时返回结果正常,处理之后数据也...

OSC-原谅帽派送员
2018/10/18
0
0
在.NET项目中使用PostSharp,使用MemoryCache实现缓存的处理

在之前一篇随笔《在.NET项目中使用PostSharp,实现AOP面向切面编程处理》介绍了PostSharp框架的使用,试用PostSharp能给我带来很多便利和优势,减少代码冗余,提高可读性,并且可以更加优雅的...

walb呀
2017/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Sleuth 整合 feign 源码分析之修改span名称

org.springframework.cloud.sleuth.instrument.web.client.feign.TraceFeignClient 包括创建span一些参数 需求场景: 由于项目中有restful 风格的http请求,sleuth feign 的span名称默认是u...

xiaomin0322
33分钟前
4
0
Less 延伸

extend 是一个 Less 伪类,它通过使用 :extend 选择器在一个选择器中扩展其他选择器样式。 扩展语法 扩展可以是附加到选择器,也可以是集中放置在规则,看上去像是带有选择器参数的可选伪类,...

凌兮洛
33分钟前
4
0
RedHat 7.0系统中安装mysql 5.7.22

在安装之前,首先要查看的是,你的系统中有没有已经安装过的情况。键入rpm -qa|grep mysql,如果无任何显示,则表示没有安装过相关组件,如果有,则根据显示出来的名字,键入rpm -e --nodeps...

最菜最菜之小菜鸟
39分钟前
4
0
RPA:企业信息孤岛的“克星”

为了降本增效,近来世界范围内掀起一股流程优化的热潮,转型升级成为众多企业时刻挂在嘴边的热词。不过在企业数字化转型的过程中,信息孤岛的出现,往往成为了企业升级的绊脚石。 信息孤岛:...

UiBot
39分钟前
4
0
我的测试

我的测试

daiison
39分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部