布条百科 - 专业百科知识分享的网站 手机版
首页 > 生活 >

写入缓存策略(3种缓存读写策略都不了解?面试很难让你通过啊兄弟)

174次浏览     发布时间:2023-02-09 08:40:06    

看到很多小伙伴简历上写了“熟练使用缓存”,但是被我问到“缓存常用的 3 种读写策略”的时候却一脸懵逼。

造成这个问题的原因是我们在学习 Redis 的时候,可能只是简单了写一些 Demo,并没有去关注缓存的读写策略,或者说压根不知道这回事。

但是,搞懂3种常见的缓存读写策略对于实际工作中使用缓存以及面试中被问到缓存都是非常有帮助的!

下面我会简单介绍一下自己对于这 3 种缓存读写策略的理解。

另外,这 3 种缓存读写策略各有优劣,不存在最佳,需要我们根据具体的业务场景选择更适合的。

Cache Aside Pattern(旁路缓存模式)

Cache Aside Pattern 是我们平时使用比较多的一个缓存读写模式,比较适合读请求比较多的场景。

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

下面我们来看一下这个策略模式下的缓存读写步骤。

先更新 DB

然后直接删除 cache 。

简单画了一张图帮助大家理解写的步骤。

:

从 cache 中读取数据,读取到就直接返回

cache 中读取不到的话,就从 DB 中读取数据返回

再把数据放到 cache 中。

简单画了一张图帮助大家理解读的步骤。

你仅仅了解了上面这些内容的话是远远不够的,我们还要搞懂其中的原理。

比如说面试官很可能会追问:“在写数据的过程中,可以先删除 cache ,后更新 DB 么?

答案: 那肯定是不行的!因为这样可能会造成数据库(DB)和缓存(Cache)数据不一致的问题。为什么呢?比如说请求 1 先写数据 A,请求 2 随后读数据 A 的话就很有可能产生数据不一致性的问题。这个过程可以简单描述为:

请求 1 先把 cache 中的 A 数据删除 -> 请求 2 从 DB 中读取数据->请求 1 再把 DB 中的 A 数据更新。

当你这样回答之后,面试官可能会紧接着就追问:“在写数据的过程中,先更新 DB,后删除 cache 就没有问题了么?

答案:理论上来说还是可能会出现数据不一致性的问题,不过概率非常小,因为缓存的写入速度是比数据库的写入速度快很多!

比如请求 1 先读数据 A,请求 2 随后写数据 A,并且数据 A 不在缓存中的话也有可能产生数据不一致性的问题。这个过程可以简单描述为:

请求 1 从 DB 读数据 A->请求 2 写更新数据 A 到数据库并把删除 cache 中的 A 数据->请求 1 将数据 A 写入 cache。

现在我们再来分析一下 Cache Aside Pattern 的缺陷。

缺陷 1:首次请求数据一定不存在 cache 的问题

解决办法:可以将热点数据可以提前放入 cache 中。

缺陷 2:写操作比较频繁的话导致 cache 中的数据会被频繁被删除,这样会影响缓存命中率 。

解决办法:

数据库和缓存数据强一致场景 :更新 DB 的时候同样更新 cache,不过我们需要加一个锁/分布式锁来保证更新 cache 的时候不存在线程安全问题。

可以短暂地允许数据库和缓存数据不一致的场景 :更新 DB 的时候同样更新 cache,但是给缓存加一个比较短的过期时间,这样的话就可以保证即使数据不一致的话影响也比较小。

Read/Write Through Pattern(读写穿透)

Read/Write Through Pattern 中服务端把 cache 视为主要数据存储,从中读取数据并将数据写入其中。cache 服务负责将此数据读取和写入 DB,从而减轻了应用程序的职责。

这种缓存读写策略小伙伴们应该也发现了在平时在开发过程中非常少见。抛去性能方面的影响,大概率是因为我们经常使用的分布式缓存 Redis 并没有提供 cache 将数据写入 DB 的功能。

写(Write Through):

先查 cache,cache 中不存在,直接更新 DB。

cache 中存在,则先更新 cache,然后 cache 服务自己更新 DB(同步更新 cache 和 DB)。

简单画了一张图帮助大家理解写的步骤。

读(Read Through):

从 cache 中读取数据,读取到就直接返回 。

读取不到的话,先从 DB 加载,写入到 cache 后返回响应。

简单画了一张图帮助大家理解读的步骤。

Read-Through Pattern 实际只是在 Cache-Aside Pattern 之上进行了封装。在 Cache-Aside Pattern 下,发生读请求的时候,如果 cache 中不存在对应的数据,是由客户端自己负责把数据写入 cache,而 Read Through Pattern 则是 cache 服务自己来写入缓存的,这对客户端是透明的。

和 Cache Aside Pattern 一样, Read-Through Pattern 也有首次请求数据一定不在 cache 的问题,对于热点数据可以提前放入缓存中。

Write Behind Pattern(异步缓存写入)

Write Behind Pattern 和 Read/Write Through Pattern 很相似,两者都是由 cache 服务来负责 cache 和 DB 的读写。

但是,两个又有很大的不同:Read/Write Through 是同步更新 cache 和 DB,而 Write Behind Caching 则是只更新缓存,不直接更新 DB,而是改为异步批量的方式来更新 DB。

很明显,这种方式对数据一致性带来了更大的挑战,比如 cache 数据可能还没异步更新 DB 的话,cache 服务可能就挂掉了。

这种策略在我们平时开发过程中也非常少见,但是不代表它的应用场景少,比如消息队列中消息的异步写入磁盘、MySQL 的 InnoDB Buffer Pool 机制都用到了这种策略。

Write Behind Pattern 下 DB 的写性能非常高,非常适合一些数据经常变化又对数据一致性要求没那么高的场景,比如浏览量、点赞量。

相关文章

鱼缸为什么破裂什么原因(鱼缸爆缸的五大原因)

鱼缸爆缸的几大原因,我给大家分析一下。·第一种就是鱼缸本身的问题,就是材质做工不行,所以说导致爆缸。·第二种就是鱼缸放置的地方不平,也就是说有些地方受力,有些地方是悬空的,这样子就会造成鱼缸受力不均匀,最终导致爆缸。·第三种就是室内的温差过大,比如说鱼缸对着空调放,那么在夏天开空调的时候,空调就吹到

2025-02-22 08:26:43

极简装修为什么贵(极简办公装修:是否真的最省钱?)

极简风格强调“少而精”,通过简约的设计、优质的建材和精细的工艺,营造出既简约又高级的办公氛围。然而,极简办公装修是否真的如许多人所认为的那样,是省钱的选择呢?首先,极简风格的设计确实有其独特的优势。它避免了纷繁复杂的装饰,将重点放在线条、层次感和意境的精准把控上。这种设计要求设计师具有丰富的经验和独

2025-02-22 08:17:16

为什么发财树叶尖发黄(秋风起,这棵发财树会黄!)

发财树是一种形态美观、四季常青的植物,不仅具有观赏价值,还寓意着招财进宝。因此,它受到了人们的喜爱,并成为了家庭、商店、饭店等公共场所的常见装饰品。然而,秋季来临时,很多人发现自己的发财树叶片变黄、枯萎,却不知道原因。那么,发财树秋季叶片变黄的常见原因有哪些呢?接下来,我们就来一起探讨一下,并提供相

2025-02-22 08:14:27

为什么装玄关有什么用(装修,为什么要设计玄关?)

一、什么是玄关?玄关指的是住宅室内与室外之间的一个过渡空间,也就是进入室内换鞋、更衣或从室内去室外的缓冲空间,也有人把它叫做斗室、过厅、门厅。二、为什么设计玄关?1、形成视觉屏障玄关对户外的视线产生了一定的视觉屏障,不至于开门见厅,让人们一进门就对客厅的情形一览无余。它注重人们户内行为的私密性及隐蔽

2025-02-22 08:01:51

煤气灶为什么会生锈(燃气灶到底该怎么选,记住这4条!)

厨房所有设备中,燃气灶的使用频率绝对算是高的选购的时候,是不是以为打得着火就得了?以前我也这么想的,但是其实真没这么简单快看看一个燃气灶到底该怎么选第一、不买铸铁炉头的燃气灶一个燃气灶的关键,一定是炉头的材质常见的有黄铜、铸铁、铝合金、陶瓷等等铸铁炉头就不要考虑了毕竟铸铁材质耐潮的较差,厨房做饭可少

2025-02-22 07:50:22

为什么鞋子里面会发霉(久放的皮鞋发霉了怎么办)

皮鞋的皮革里不但含有脂肪更含有蛋白质,汗液,保存或未及时处理雨水浸湿等原因,都会导致皮鞋发霉。这是因为皮革里的脂肪、蛋白质在某种条件及环境下会繁殖出细菌和霉菌,一旦出现霉菌繁殖的情况,就会导致皮鞋发霉,不但影响美观更影响穿着。避免及解决发霉的最好办法,就是使用正确的保养方法。在日常的保养中,首先要避

2025-02-22 07:48:29