缓存更新策略

问题:项目中,Redis用了缓存热点数据,持久化数据在MySQL DB中;那么Redis缓存数据什么时候更新呢?

方法A: 步骤:1. 删除缓存,2.更新DB , 3.下一次读操作没有命中缓存时,更新缓存; 存在的问题:如果另外一个读任务发生在"更新DB"之前,那么缓存就"更新DB"之前的“脏数据”;

方法B: 步骤:1.更新DB,2.更新缓存; 存在的问题:如果发生并发“更新数据”,程序不能保证“更新缓存”的先后顺序,存在“脏数据”的可能性;

方法C: 步骤:1.更新DB, 2. 删除缓存; 3. 下一次读操作没有命中缓存时,更新缓存; 存在的问题:如果在步骤1“更新DB”之前,有一个并发读任务没有命中缓存,从DB读取到“老数据”,在步骤2之后才把“老数据”更新到缓存,那么缓存中就是“脏数据”;

思考:方法C采取的策略,在实际场景中发送的概率比前两种方法小很多;但是怎么完全杜绝这种问题呢?答案是分布式事务-2PC/3PC or Paxos, 但分布式事务会增加系统复杂度,降低系统可用性;所以实际项目中,采用方法C.

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博文

/var/spool/clientmqueue目录下存在大量文件的原因及解决方法

问题现象:linux操作系统中的/var/spool/clientmqueue/目录下存在大量文件。原因分析: 系统中有用户开启了cron,而cron中执行的程...

2968
来自专栏Android知识点总结

SpringBoot-03-之热部署

1204
来自专栏ytkah

公众号自定义菜单点击可打开相关小程序

微信公众号可将已关联的小程序页面放置到自定义菜单中,用户点击后可打开该小程序页面。如下图,在微信公众平台自定义菜单那边,菜单内容选择“跳转小程序”,然后设置小程...

5565
来自专栏跟着阿笨一起玩NET

SQL Server数据库row_number() over() 来自动产生行号

本文我们主要介绍了SQL Server数据库用row_number() over() 来自动产生行号的一系列的操作,希望本次的介绍能够对您有所帮助。

3771
来自专栏前端vue

1.模拟数据及开发,线上环境分配

什么是easy-mock? easy-mock是一个可视化,并且能快速生成模拟数据的持久化服务,上手简单。为前端开发提供了非常便捷的服务 easy-mock...

2262
来自专栏余生开发

vue - .babelrc

        // env项是借助插件babel-preset-env,下面这个配置说的是babel对es6,es7,es8进行转码,并且设置amd,comm...

1062
来自专栏L宝宝聊IT

ESXI的安装和部署

2134
来自专栏python百例

120-打造vim为python IDE

pycharm之类的IDE很好,但是不能在无图形的终端下使用,另外它们是“重量级选手”。如果偶尔需要vim编辑python程序,能让vim支持python的语法...

1384
来自专栏极客慕白的成长之路

CodeBlock最新版本离线安装使用教程

1933
来自专栏懒人开发

hadoop(2):对应的环境

这里自己也没有对应的服务器 自己通过VBox(用 VMware也一样) 创建多个linux的虚拟机

1203

扫码关注云+社区