Redis-6-三种缓存读写策略

news/2024/10/15 20:17:28

2.1 旁路缓存

Cache Aside Pattern(旁路缓存)适合读请求比较多的场景

Cache Aside Pattern 中服务端需要同时维系 db 和 cache,并且是以 db 的结果为准。

2.1.1 写

  • 先更新db
  • 直接删除缓存

2.1.2 读

  • 先读缓存
    • 有,则从缓存返回。
    • 没有,从db中读取返回。
  • 再将读取的数据写入缓存

2.1.3 常见问题

1.写,写DB后咋是删缓存不是更新缓存?

写N次,只有最后一次数据的有效,前面写的都会被覆盖。

读不到的时候自然会重建缓存,我们直接删除了,等读的时候重建即可。

2.写,可不可以先删除缓存,再更新DB?

不可以。

前面已经讲了,我们更新的时候,db更新没问题,但是缓存呢不做更新,直接删除。

现在的问题就是,更新db和删除缓存这两个操作的先后问题。

假设我们数据库中有个值name=yang,我们准备更新成yang37

2.1 (×)先删除缓存,再更新db。

这个情况,主要是考虑并发场景,在删除缓存 -> 更新db期间,db中的始终是旧数据。

如果线程2发生了读取请求,会导致数据不一致。

  • 线程1:尝试更新name从yang到yang37
  • 线程2:尝试读取name的值

image-20240609123026058

最终我们可以看到,缓存中的数据还是旧数据yang,而db中是正确的yang37,数据不一致

问题的根源在哪里,在于你线程2读取缓存是很快的,缓存中没值,必然触发缓存的重建。

  • 线程1的db更新完了,那就皆大欢喜,即左边线程1整个期间没有并发问题。
  • 线程1的db没更新完,db中的必定是旧数据,重建的缓存值也必定成旧数据,导致出问题。

注意图最下面的两个框框。最重要的是,在缓存有效期内,你缓存的一直是脏数据,如果这个缓存没过期时间,那么缓存中的数据始终有问题。

这个问题出现的概率大吗?即左边删除缓存 -> 更新db的期间能不能包裹住右边边。

image-20240609133539141

实际上,db查询数据比更新数据快,这个情况很容易出现。

2.2 (√) 先更新db,再删除缓存。

接着上面的,来看下先更新db的。

image-20240609125453219

嗯,这里,如果更新db -> 删除缓存期间有读取请求,我们的线程2还是会读取到脏数据。

但是,咱们最终缓存中的数据不存在,下次查询会触发重建。

先删除缓存再更新db的方式,逻辑上就存在问题了,咱们这个影响程度小的多。

咱们只是在这期间有短暂的不一致问题,不会导致最终状态下的数据不一致。

但是,还是可能有缓存最终不一致的情况,就是刚好缓存失效了,例如下图。

image-20240609131314236

这里的问题点是什么,线程2的更新缓存操作覆盖了线程1的更新db+删除缓存的操作。

它必须要完整的包裹住线程1的更新操作和删除操作。

  • 如果线程1更新操作在线程2查询db的操作之前,那么此时查询到的数据已经被更新了,重建的缓存值刚好是正确的。
  • 如果线程1的删除操作发生在线程2的更新缓存之后,那么此时缓存中的数据已经被删除了,下次重建会成为正确的值,也符合我们的预期。

我们注意下哈,先决条件是线程2从db查到旧数据之后,线程1开始更新db了。

然后,必须完完整整的包裹住这整个操作,必须得下面这样。

image-20240609132053259

即,哪怕我像下面这样两种情况,它也不会有问题,必须满足上面包裹住的场景,才可能有问题。

image-20240609132534799 image-20240609132659946

实际上,db查询数据比更新数据快,所以这个更新db+删除缓存的时间很难比查询db+更新缓存的时间长

别忘了我们还有并发+缓存失效的背景,这所有因素组合在一起才可能有这个数据不一致的情况,所以出现问题的概率是很低的。

你说,咱们方案1中过期时间的场景都还没讨论呢。哈哈,其实不用讨论了,你想啊,方案1还没说过期就有很大隐患了,还不要说咱们现在这里的讨论的方案2+过期的场景。

综上呢,咱们的正确方案是:先更新db,再删除缓存。

2.2 读写穿透

2.3 异步缓存写入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/41671.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

PTA4~6次作业总结

(1)前言: 不同于大一上的c语言的PTA作业,java的PTA作业越来越贴近生活中的需求,难度也越来越大了,代码的设计量和题目考察的知识点也是.最后一次作业没有给测试样例,导致有几个点没过,不知道错哪了,测不出来,非常的难受. 这次作业使用了ArryList 先了解下ArryList ArrayList…

构建和谐网络环境:AI敏感词屏蔽技术的应用与挑战

在当今信息爆炸的时代,网络空间的信息安全和言论自由之间的平衡成为了一个重要议题。为了维护网络环境的健康发展,一种能够自动屏蔽敏感词的AI技术应运而生。本文将结合“智谱清言”的智能体“净言”为例,探讨AI敏感词屏蔽技术的应用及其面临的挑战。 一、AI敏感词屏蔽技术的…

Ubuntu基础环境配置

博主:Agony‍ 下载ubuntu地址:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/选择你所需要的版本下载即可‍ root设置ubuntu系统搭建好之后‍打开终端。输入以下命令来切换到root用户(如果您当前用户有sudo权限): sudo su或者,如果您已经有了root用户并知道密码…

南昌航空大学pta总结

前言 背景介绍: 继上次PTA题目讲解完,本次博客会进行对后几次题目集的讲解说明和题后总结 目的和目标: 及时反馈学习成果,达到学由所会,及时吸收和深入学习的目的 学习收益: 通过后面几次的题目学习,使得我对java的语法代码以及运用熟练度有了极大的进步,同时也对学习代码…

两次pta题目总结

两次pta题目总结 写在前面 这两次pta是新题目,上次那个答题判题的没有继续迭代了,根据这两次题目我也学到了一些东西,主要是面向对象设计模式的运用,接口的使用,以及递归算法的使用等等 第一题题目内容: 智能家居是在当下家庭中越来越流行的一种配置方案,它通过物联网技…

VMware ESXi 8.0U2c macOS Unlocker OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版

VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版 VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) …

第二次Blog作业

此次Blog为题目集4-6的总结性内容 前言(题目集总结) 第四次题目集 (此次题目集为答题判题程序的最后一版,综合性最强,总体偏难) 1.知识点 字符串解析与处理: 程序需要能解析和处理各种格式的字符串,包括题目信息、试卷信息、学生信息、答卷信息和删除题目信息。这涉及到…

第二次blog大作业

1.前言 第四次到第六次大作业所覆盖的知识点还是很多的,例如:抽象类,集合,排序方法,接口等等。第四次的大作业是关于学生答卷的流程,考察了我们对于集合和排序算法,以及类与类之间的关系,相比他前面的三个小弟,他增加了多选题和填空题,在难度上还是有所提升的,不过也…