首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

谈谈缓存更新

看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。...试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。...这里,我们先不讨论更新缓存更新数据这两个事是一个事务的事,或是会有失败的可能,我们先假设更新数据库和更新缓存都可以成功的情况(我们先把成功的代码逻辑先写对)。...Write Back套路,一句说就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。...比如,计算中的很多虚拟化技术的原理,和传统的虚拟内存不是很像么?Unix下的那些I/O模型,也放大到了架构里的同步异步的模型,还有Unix发明的管道不就是数据流式计算架构吗?

1.1K20

缓存雪崩、缓存穿透、缓存预热、缓存更新缓存降级等问题!

,今天给大家整理一篇关于Redis经常被问到的问题:缓存雪崩、缓存穿透、缓存预热、缓存更新缓存降级等概念的入门及简单解决方案。...(2)还有一个解决办法解决方案是:给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存,实例伪代码如下: ?...解释说明: 1、缓存标记:记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去更新实际key的缓存; 2、缓存数据:它的过期时间比缓存标记的时间延长1倍,例:标记缓存时间30分钟,数据缓存设置为60...这样,当缓存标记key过期后,实际缓存还能把旧数据返回给调用端,直到另外的线程在后台更新完成后,才会返回新缓存。...关于缓存崩溃的解决方法,这里提出了三种方案:使用锁或队列、设置过期标志更新缓存、为key设置不同的缓存失效时间,还有一各被称为“二级缓存”的解决方法,有兴趣的读者可以自行研究。

3.8K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    漫谈缓存更新之道

    许多人在更新缓存时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载入缓存中。 然而,这个逻辑是错误的!!!...试想,两个并发操作,一个更新,一个查询,更新删除缓存后,查询没有命中缓存,先把旧数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是旧数据,导致缓存中持续地产生脏数据....这里,我们先不讨论更新缓存更新数据这两个事是一个事务的事,或是会有失败的可能,我们先假设更新数据库和更新缓存都可以成功的情况 更新缓存的的Design Pattern有四种 1 Cache Aside...,成功后,让缓存失效 一个查询操作,一个更新操作的并发 首先,没有了删除cache数据的操作,而是先更新数据库中的数据,此时,缓存依然有效,所以,并发的查询操作拿的是没有更新的数据,但是,更新操作马上让缓存的失效了...则用缓存服务自己来加载,从而对应用方是透明的 2.2 Write Through 和Read Through相仿,不过是在更新数据时发生 当有数据更新时 如果没有命中缓存,直接更新数据库,然后返回

    3.2K31

    缓存更新的套路

    看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。...试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。...这里,我们先不讨论更新缓存更新数据这两个事是一个事务的事,或是会有失败的可能,我们先假设更新数据库和更新缓存都可以成功的情况(我们先把成功的代码逻辑先写对)。...Write Back套路,一句说就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。...比如,计算中的很多虚拟化技术的原理,和传统的虚拟内存不是很像么?Unix下的那些I/O模型,也放大到了架构里的同步异步的模型,还有Unix发明的管道不就是数据流式计算架构吗?

    1.3K130

    缓存更新的套路

    看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。...试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。...这里,我们先不讨论更新缓存更新数据这两个事是一个事务的事,或是会有失败的可能,我们先假设更新数据库和更新缓存都可以成功的情况(我们先把成功的代码逻辑先写对)。...Write Back套路,一句说就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。...比如,计算中的很多虚拟化技术的原理,和传统的虚拟内存不是很像么?Unix下的那些I/O模型,也放大到了架构里的同步异步的模型,还有Unix发明的管道不就是数据流式计算架构吗?

    2.2K70

    缓存更新策略

    问题:项目中,Redis用了缓存热点数据,持久化数据在MySQL DB中;那么Redis缓存数据什么时候更新呢? 方法A: 步骤:1....删除缓存,2.更新DB , 3.下一次读操作没有命中缓存时,更新缓存; 存在的问题:如果另外一个读任务发生在"更新DB"之前,那么缓存就"更新DB"之前的“脏数据”; 方法B:...步骤:1.更新DB,2.更新缓存; 存在的问题:如果发生并发“更新数据”,程序不能保证“更新缓存”的先后顺序,存在“脏数据”的可能性; 方法C:...步骤:1.更新DB, 2....下一次读操作没有命中缓存时,更新缓存; 存在的问题:如果在步骤1“更新DB”之前,有一个并发读任务没有命中缓存,从DB读取到“老数据”,在步骤2之后才把“老数据”更新缓存,那么缓存中就是

    1.5K00

    缓存更新的套路

    阅读本文大概需要 10 分钟 原文 | http://sina.lt/gpqN 看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载到缓存中。...试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。...这里,我们先不讨论更新缓存更新数据这两个事是不是一个事务的事,或是会有失败的可能,我们先假设更新数据库和更新缓存都可以成功的情况(我们先把成功的代码逻辑先写对)。...Write Back 套路,一句说就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。...比如,计算中的很多虚拟化技术的原理,和传统的虚拟内存不是很像么?Unix 下的那些 I/O 模型,也放大到了架构里的同步异步的模型,还有 Unix 发明的管道不就是数据流式计算架构吗?

    1.3K20

    Redis缓存雪崩、缓存穿透、缓存预热、缓存更新缓存降级等问题

    一、缓存雪崩 由于原有缓存失效,新缓存未到期间,比如我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期,所有原本应该访 问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,...(2)还有一个简单方案就时将缓存失效时间分散开。 二、缓存穿透 缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。...三、缓存预热 缓存预热这个应该是一个比较常见的概念,相信很多人都应该可以很容易的理解,缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。...用户直接查询事先被预热的缓存数据 解决办法 (1)直接写个缓存刷新页面,上线时手工操作下; (2)数据量不大,可以在项目启动的时候自动进行加载; (3)定时刷新缓存; 四、缓存更新 除了缓存服务器自带的缓存失效策略之外...,过期的话就去底层系统得到新数 据并更新缓存

    2.2K20

    为什么是删除缓存,而不是更新缓存

    原因很简单,很多时候,在复杂点的缓存场景,缓存不单单是数据库中直接取出来的值。 比如可能更新了某个表的一个字段,然后其对应的缓存,是需要查询另外两个表的数据并进行运算,才能计算出缓存最新的值的。...另外更新缓存的代价有时候是很高的。是不是说,每次修改数据库的时候,都一定要将其对应的缓存更新一份?也许有的场景是这样,但是对于比较复杂的缓存数据计算的场景,就不是这样了。...如果你频繁修改一个缓存涉及的多个表,缓存也频繁更新。但是问题在于,这个缓存到底会不会被频繁访问到?...2)最初级的缓存不一致问题及解决方案 问题:先更新数据库,再删除缓存。如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致。 解决思路:先删除缓存,再更新数据库。...如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,所以去读了数据库中的旧数据,然后更新缓存中。

    15310

    缓存层场景实战读缓存,如何更新缓存+缓存的高可用设计+监控

    ◆ 如何更新缓存 更新缓存的步骤特别简单,共两步:更新数据库和更新缓存。但这简单的两步中需要考虑很多问题。 1)先更新数据库还是先更新缓存更新缓存时先删除还是直接更新?...◆ 组合1:先更新缓存,再更新数据库 对于这个组合,会遇到这种情况:假设第二步更新数据库失败了,要求回滚缓存更新,这时该怎么办呢?...2)线程A将缓存中的值更新成b,且保存了原来的值a,然后更新数据库。 3)线程B将缓存中的值更新成c,且保存了原来的值b,然后更新数据库。...◆ 组合3:先更新数据库,再更新缓存 对于组合3,同样需要考虑两个问题。 1)假设第一步(更新数据库)成功,第二步(更新缓存)失败了怎么办?...◆ 组合5:先删除缓存更新数据库,再删除缓存 还有一个方案,就是先删除缓存,再更新数据库,再删除缓存

    79610

    缓存层场景实战读缓存,如何更新缓存+缓存的高可用设计+监控

    如何更新缓存 更新缓存的步骤特别简单,共两步:更新数据库和更新缓存。但这简单的两步中需要考虑很多问题。 1)先更新数据库还是先更新缓存更新缓存时先删除还是直接更新?...组合1:先更新缓存,再更新数据库 对于这个组合,会遇到这种情况:假设第二步更新数据库失败了,要求回滚缓存更新,这时该怎么办呢?...2)线程A将缓存中的值更新成b,且保存了原来的值a,然后更新数据库。 3)线程B将缓存中的值更新成c,且保存了原来的值b,然后更新数据库。...组合3:先更新数据库,再更新缓存 对于组合3,同样需要考虑两个问题。 1)假设第一步(更新数据库)成功,第二步(更新缓存)失败了怎么办?...组合5:先删除缓存更新数据库,再删除缓存 还有一个方案,就是先删除缓存,再更新数据库,再删除缓存

    82230

    Redis 缓存主动更新策略

    Cache Aside Pattern:由缓存的调用者,在更新数据库的同时更新缓存Read/Write Through Pattern:缓存与数据库整合为一个服务,由服务来维护一致性。...Pattern 可靠性更高一点操作缓存和数据库时要考虑如下几个问题- 删除缓存还是更新缓存?...- 更新缓存:每次更新数据库都更新缓存,无效写操作较多- 删除缓存更新数据库时让缓存失效,查询时再更新缓存(更优)- 如何保证缓存和数据库的操作的同时成功或失败?...(线程安全)- 先删除缓存,再操作数据库- 先操作数据库,再删除缓存- 由于 redis 的速度远比 MySQL 要快,所以方案二为优选图片缓存更新策略的最佳方案- 低一致性需求:使用Redis自带的内存淘汰机制...- 高一致性需求:主动更新,并以超时剔除作为兜底方案- 读操作:- 缓存命中则直接返回- 缓存未命中则查询数据库,并写入缓存,设定超时时间- 写操作:- 先写数据库,然后再删除缓存- 要确保数据库与缓存操作的原子性

    4.1K50

    WordPress发布更新文章、提交审核评论自动清理腾讯CDN缓存

    二、部署代码 同时使用 3 个 CDN,其中 VC 和腾讯的 CDN 主要是负责主站缓存,也就是 html 页面。相当于套了一次百度加速一样。...再设定下 CDN 缓存时间,比如 1 天,那么文章或评论有更新就得 1 天后才能刷新了。...在腾讯 CDN 开发大牛廖大师的指点下,成功搞定了 WP 发布文章或评论刷新腾讯 CDN 缓存,下面开始分享。...完整的 php 代码如下: /** * WordPress 发布/更新文章、提交/审核评论自动清理腾讯CDN缓存(首页和当前文章) By 张戈博客 * 文章地址:https://zhangge.net...CDN缓存 add_action('publish_post', 'Clean_By_Publish', 0); //提交评论更新本文CDN缓存 add_action('comment_post',

    1.9K100

    你是如何更新缓存的?看懂这篇缓存读写策略

    也许你会觉得缓存读写很简单: 先读缓存缓存不命中就查DB,查到了就回种缓存 先删缓存,再更新DB,而后续操作会把数据再装载到缓存 这是错误的。最简单的两个并发操作:更新&查询。...更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存,然后更新操作更新了数据库。于是,缓存中的数据还是老数据,导致缓存中的数据是脏的,而且还一直这样脏下去。...一个查询操作,一个更新操作的并发 首先,没有了删除cache数据的操作,而是先更新数据库中的数据,此时,缓存依然有效,所以,并发的查询操作拿的是没有更新的数据,但是,更新操作马上让缓存的失效了,后续的查询操作再把数据从数据库中拉出来...为什么不是写DB后更新缓存?...则用缓存服务自己来加载,从而对应用方是透明的 2.2 Write Through 和Read Through相仿,不过是在更新数据时发生 当有数据更新时 如果没有命中缓存,直接更新数据库,然后返回 如果命中了缓存

    1.1K51

    如何以正确姿势引入缓存更新

    互联网业务系统在应对大并发时候通常会选择引入缓存,当然可以Scale UP,但是响应成本上升,引入缓存是一种比较经济有效方法。...在面对各种缓存更新与访问策略时候我们可能会眼花缭乱,不合适的缓存更新策略可能达不到预期效果。 为什么要引入缓存呢? DB查询慢,通过分库分表或者对数据库进行垂直扩展,通过索引加速查询速度。...基于缓存可以轻松实现复杂查询。 引入缓存钱我们最好问自己三个问题 系统是否存在读多写少? 数据是否写入一次,多次读取? 数据是否始终唯一?...1 数据访问策略 1.1 Cache-Aside image.png Cache Aside作为最常见一种缓存更新策略,在后台使用最为广泛。...假设更新时间为m,单位为秒,更新因子为p(范围0-1) 1 应用程序访问Cache,如果距离上次更新时间小于m*p,那么可以直接使用Cache数据 2 如果距离上次访问时间大于m*p,小于m,那么触发异步更新

    1.2K30

    ​到底是先更新数据库还是先更新缓存

    此时,就需要我们不断的进行优化,一种常用的优化手段就是引入缓存。而引入缓存后,我们在向数据库插入数据时,到底是先更新数据库还是先更新缓存呢?...但是在后续更新数据的操作中,是更新完数据库,接下来更新缓存还是删除缓存?又或者是先删除缓存,再更新数据库? 缓存更新策略 从理论上来说,给缓存设置过期时间,其实是一中最终一致性的表现。...(1) 线程A更新了数据库 (2) 线程B更新了数据库 (3) 线程B更新缓存 (4) 线程A更新缓存 此时就会出现数据库中的数据与缓存的数据不一致的情况,这是因为线程A先更新了数据库,可能因为网络等异常情况...,线程B更新完数据库进而更新缓存,当线程B更新缓存后,线程A才更新缓存,这就导致了数据库数据与缓存数据的不一致。...先删除缓存更新数据库 先删除缓存更新数据库的方案也存在着线程安全的问题,例如,线程A更新缓存,同时,线程B读取缓存的数据。可能会出现下面的执行顺序。

    2.1K20

    到底是先更新数据库还是先更新缓存

    此时,就需要我们不断的进行优化,一种常用的优化手段就是引入缓存。而引入缓存后,我们在向数据库插入数据时,到底是先更新数据库还是先更新缓存呢?...但是在后续更新数据的操作中,是更新完数据库,接下来更新缓存还是删除缓存?又或者是先删除缓存,再更新数据库? 缓存更新策略 从理论上来说,给缓存设置过期时间,其实是一种最终一致性的表现。...(1) 线程A更新了数据库 (2) 线程B更新了数据库 (3) 线程B更新缓存 (4) 线程A更新缓存 此时就会出现数据库中的数据与缓存的数据不一致的情况,这是因为线程A先更新了数据库,可能因为网络等异常情况...,线程B更新完数据库进而更新缓存,当线程B更新缓存后,线程A才更新缓存,这就导致了数据库数据与缓存数据的不一致。...先删除缓存更新数据库 先删除缓存更新数据库的方案也存在着线程安全的问题,例如,线程A更新缓存,同时,线程B读取缓存的数据。可能会出现下面的执行顺序。

    1.4K10
    领券