缓存更新策略

问题:项目中,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 条评论
登录 后参与评论

相关文章

来自专栏Timhbw博客

lnmp安装fileinfo模块

2018-02-0411:44:40 发表评论 38℃热度 fileinfo安装 php.ini 中添加配置 相关服务重启 检查是否成功安装 目录 l...

37660
来自专栏女程序员的日常

Open-Drain&Push-Pull

在配置GPIO(General Purpose Input Output)管脚的时候,常会见到两种模式:开漏(open-drain,漏极开路)和推挽(push-...

20510
来自专栏懒人开发

hadoop(2):对应的环境

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

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

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

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

96910
来自专栏技术博文

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

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

30680
来自专栏L宝宝聊IT

esxi网络中虚拟机的相关操作

26840
来自专栏前端vue

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

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

27120
来自专栏python百例

120-打造vim为python IDE

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

21240
来自专栏左瞅瞅,右瞅瞅

DNS上线之路(六)——DNS管理

由于DNS 改变,服务器重启会获得原有的不可用的dns服务器信息。导致业务不可用。

15230
来自专栏余生开发

vue - .babelrc

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

13820

扫码关注云+社区

领取腾讯云代金券