五张动图带你彻底搞懂五种缓存策略: 让你的系统快如闪电 !

缓存机制以其显著的性能优化能力,成为系统架构中不可或缺的一部分。然而,缓存引入的同时,也带来了缓存与数据库之间的数据一致性问题。那么,我们该如何有效地处理这一挑战呢?下面,让我们一起探讨五种常见的缓存策略。

五种缓存策略
Cache-Aside 策略

这是迄今为止最常用的策略,它看起来是这样的:
在这里插入图片描述

工作流程如下:

  1. 当读取数据时,应用程序首先检查缓存,如果缓存中有该数据(即缓存命中),应用程序将从缓存中获取数据直接返回。

  2. 如果缓存中没有数据(缓存未命中),应用程序查询数据库并将数据返回给请求者。

  3. 应用程序还将数据存储在缓存中以供将来的请求使用。

需要注意的是整个过程中,缓存不会与数据库交互。但应用程序会和数据库交互。

优点
  • 简单易于实现。
  • 只有被请求的数据会被加载到缓存中,减少了不必要的数据加载。
缺点
  • 复杂性:应用程序需要处理缓存一致性和失效问题。
  • 额外的代码:需要在应用程序中加入缓存控制逻辑。

这种策略非常适合数据读取频繁,但更新较少的场景,例如用户配置数据加载,首次加载时从数据库读取并缓存,之后的读取从缓存中获取。

Read Through 策略

在Read Through 策略中,缓存位于应用程序和数据库之间,参考下图:
在这里插入图片描述

以下是Read Through 策略的流程:

  1. 应用程序总是会向缓存发出读取请求,如果缓存命中,则数据会立即从缓存中返回,流程结束。
  2. 但如果发生缓存未命中,缓存将从数据库中获取数据并将其返回给应用程序。
    这种策略下,应用程序不与数据库交互。但缓存和数据库交互,这也是它和Cache-Aside 策略的最大不同点。
优点
  • 简化了读取操作:应用程序只需关注读取数据,不需要处理缓存未命中逻辑。
  • 数据一致性:由缓存系统自动管理缓存更新和缓存未命中。
缺点
  • 缓存写入操作需要单独处理:需要结合其他写策略(如Write Through、Write Back、Write Around)。

这种策略适合读取操作频繁,且希望简化缓存管理的场景,例如电商系统中商品详情页面加载时,如果缓存中没有数据,缓存系统自动从数据库加载并缓存。

Write Through 策略

Write Through 策略下,应用程序不会将数据写入数据库,而是先写入缓存,然后缓存立即写入数据库,这里的“立即”一词很重要。

看下面的插图:
在这里插入图片描述

优点
  • 数据一致性高:
  • 读取速度快:读取时总是能从缓存中获取最新数据。
缺点
  • 写入性能较低:每次写操作需要更新两个存储位置。
  • 对缓存资源的需求较高:需要频繁更新缓存。

这种策略适合数据一致性要求较高或写操作频率较低但读取频率高的场景。

Write Back 策略

Write Back 策略本质上是Write Through策略的一种变体。它们之间只有一个关键的区别:在Write Back 策略中,应用程序直接将数据写入缓存(就像Write Through策略一样)。但是,缓存不会立即写入数据库,而是在特定条件下(如缓存满了或者达到一定时间间隔)再同步到数据库。

可以看到下图中,代表数据的小圆圈流到cache时停留了一会。
在这里插入图片描述

这样做的好处是,如果您有大量写入工作,缓存的压力会减少。对数据库的请求会被分批处理,从而提高整体写入性能。

缺点是,如果发生缓存故障,可能会丢失数据。

优点
  • 写入性能高:写操作只更新缓存,速度快。
  • 减少后端存储访问:批量写回减少了对后端存储的写操作次数。
缺点
  • 数据一致性风险:缓存未写回时,后端存储数据可能不是最新的。
  • 复杂的缓存管理:需要处理缓存淘汰和批量写回机制。

这种策略适合写操作频繁,但对数据一致性要求不高的场景,例如社交媒体平台上的点赞和评论计数,可以延迟更新到数据库中。

Write Around 策略

在Write Around 策略中,数据总是被写入数据库,而读取的数据则从缓存读取,如果发生缓存未命中,应用程序将从数据库读取并更新缓存。

它看起来是这样的:
在这里插入图片描述

这基本上与Cache-Aside 策略 类似,但增加了有关如何处理更新数据的上下文,既如何尽量保证更新时缓存和数据库的一致性,这个问题又可以单独写一篇文章了。

优点
  • 减少缓存污染:避免将不常读取的数据写入缓存。
  • 适合写多读少的数据:减少缓存空间浪费。
缺点
  • 读取性能受影响:首次读取时需要从后端存储加载数据。
  • 缓存未命中率高:写操作不更新缓存,读取时可能经常需要访问后端存储。

这种策略适合写操作频繁但读取不频繁的场景,例如日志记录系统,因为日志数据频繁写入但很少读取。

此时,您可能会认为所有这些策略听起来都很混乱,很难记住,在这一点上我和你有同样的感受。

因此,我制作了一个方便的表格,可以帮助您快速复习上述所有策略。
在这里插入图片描述

综合案例

在实际应用中,这些策略经常结合使用,以达到最优的性能和数据一致性。

假设有一个电子商务平台,涵盖以下几个关键组件:用户信息、商品详情、购物车、订单处理、推荐系统。下面说明如何综合使用这些缓存策略。

用户信息缓存(Cache-Aside + Write Through)
  • 用户信息需要频繁读取,偶尔会更新,且需要保证数据一致性。
  • 使用Cache-Aside策略:读取操作从缓存中获取,如果未命中,从后端存储读取并更新缓存。
  • 使用Write Through策略:写操作同时更新缓存和后端存储,确保数据一致。
商品详情缓存商品详情缓存(Read Through + Write Around):
  • 商品详情读取频繁,但更新较少。
  • 使用Read Through策略:读取操作从缓存中获取,如果未命中,缓存系统自动从后端存储读取并更新缓存。
  • 使用Write Around策略:写操作直接写入后端存储,不更新缓存,减少缓存污染。
购物车缓存(Cache-Aside + Write Back)
  • 购物车数据频繁更新,读写性能要求高,但允许短暂不一致。
  • 使用Cache-Aside策略:读取操作从缓存中获取,如果未命中,从后端存储读取并更新缓存。
  • 使用Write Back策略:写操作只更新缓存,延迟或批量写回后端存储,提高写入性能。
订单处理缓存(Cache-Aside + Write Through)
  • 订单数据需要保证一致性,同时读取频繁。
  • 使用Cache-Aside策略:读取操作从缓存中获取,如果未命中,从后端存储读取并更新缓存。
  • 使用Write Through策略:写操作同时更新缓存和后端存储,确保数据一致。
推荐系统缓存(Read Through + Write Around)
  • 推荐系统需要高读性能,数据更新频繁但不常读取。
  • 使用Read Through策略:读取操作从缓存中获取,如果未命中,缓存系统自动从后端存储读取并更新缓存。
  • 使用Write Around策略:写操作直接写入后端存储,不更新缓存,减少缓存污染。

更多高质量原创技术文章可扫码关注公众号:“非科班大厂码农”
在这里插入图片描述

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值