探秘Redis读写策略:CacheAside、读写穿透、异步写入

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: 本文介绍了 Redis 的三种高可用性读写模式:CacheAside、Read/Write Through 和 Write Behind Caching。CacheAside 简单易用,但可能引发数据不一致;Read/Write Through 保证数据一致性,但性能可能受限于数据库;Write Behind Caching 提高写入性能,但有数据丢失风险。开发者应根据业务需求选择合适模式。

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

逻辑图.png

Redis 是一种高性能的内存数据库,它不仅可以作为数据库的缓存层,还可以支持多种读写模式,使得应用在面对不同业务场景时可以灵活地选择最合适的模式。本文将重点介绍 Redis 在高可用性上的三种常见读写模式:CacheAside 旁路缓存、Read/Write Through 读写穿透,以及 Write Behind Caching 异步缓存写入,并对它们进行比较,帮助大家了解这些模式的特性以及在不同业务场景下的应用。

CacheAside 旁路缓存

CacheAside 旁路缓存是一种常见的缓存策略,将缓存作为独立的存储层,在应用程序和数据库之间起到中间缓存层的作用。应用程序在查询数据时,首先会尝试从缓存中获取数据,如果缓存命中则直接返回数据;如果缓存未命中,则从数据库中查询数据,并将查询到的数据写入缓存。应用程序在写数据时直接将数据写入数据库,同时可能选择性地更新或失效缓存。

读操作:

步骤1:应用程序尝试从缓存中获取数据。

步骤2:如果缓存命中,则返回缓存中的数据。

步骤3:如果缓存未命中,从数据库中查询数据。

步骤4:将查询到的数据写入缓存。

步骤5:返回数据库中的数据给应用程序。

写操作:

步骤1:应用程序直接将数据写入数据库。

步骤2:根据需求,选择性地将缓存中的相应数据更新或失效,以保持缓存的一致性。

优点

简单易用:CacheAside 模式的实现相对简单,应用程序负责控制缓存操作,易于理解和维护。

灵活性高:应用程序可以灵活选择从缓存或数据库中读取数据,以及何时更新或失效缓存。

数据一致性:在缓存未命中时直接从数据库获取数据,确保数据一致性较高。

缺点

缓存失效:当缓存中的数据过期或被删除时,需要重新从数据库获取数据,可能增加数据库的压力。

数据不一致:如果在写入数据库后没有及时更新缓存,可能导致缓存数据与数据库数据不一致。

应用复杂性:应用程序需负责处理缓存的更新和失效,增加业务逻辑的复杂性。

Read/Write Through(读写穿透)

Read/Write Through 是一种读写穿透的缓存策略。它将缓存与数据库紧密结合,应用程序在读写数据时都会通过缓存层操作。如果缓存未命中,应用程序将通过缓存层从数据库中查询数据,并将数据写入缓存;写数据时,应用程序直接通过缓存层将数据写入数据库,并将数据缓存到 Redis 中。通过这种方式,数据在缓存和数据库之间保持一致。

读操作:

步骤1:应用程序首先从缓存中查询数据。

步骤2:如果缓存命中,返回缓存中的数据。

步骤3:如果缓存未命中,通过缓存层查询数据库。

步骤4:将查询到的数据写入缓存。

步骤5:返回数据库中的数据给应用程序。

写操作:

步骤1:应用程序通过缓存层直接写入数据库。

步骤2:将写入的数据同步到缓存中,确保缓存和数据库的数据一致。

优点

数据一致性:通过缓存和数据库之间的同步操作,确保数据一致性。

简单操作:应用程序无需直接与数据库交互,通过缓存层完成读写操作,简化业务逻辑。

读写效率高:通过缓存层直接操作数据库和缓存,减少应用程序和数据库之间的交互,提高读写效率。

缺点

性能受限:由于每次读写操作都需要经过缓存层和数据库,可能会受到数据库性能的影响,导致性能瓶颈。

依赖性强:缓存层和数据库之间的紧密联系使得系统对缓存层的依赖性较高,一旦缓存出现问题可能会影响数据库操作。

实现复杂:需要确保缓存和数据库之间的数据同步,增加了系统的复杂性。

Write Behind Caching(异步缓存写入)

Write Behind Caching 是一种异步缓存写入策略。它将写入操作分成两部分:首先将数据写入缓存,然后异步地将数据写入数据库。这种模式提高了写操作的性能,因为应用程序无需等待数据写入数据库即可继续执行其他任务。这种策略还可以通过批量写入的方式优化数据库操作,提高整体性能。

写操作:

步骤1:应用程序将数据写入缓存。

步骤2:数据在缓存中暂存,立即返回给应用程序。

步骤3:缓存中的数据通过异步任务批量写入数据库。

步骤4:异步任务可以定期执行,或在特定条件下触发,例如缓存数据量达到一定阈值时。

步骤5:根据需要,可以在数据库写入完成后清理缓存,确保数据最终的一致性。

读操作:

步骤1:应用程序直接从缓存中读取数据。

步骤2:如果缓存未命中,则从数据库中查询数据,并将数据写入缓存。

优点

高写入性能:因为写入是异步进行的,应用程序无需等待写入操作完成,提高了写入性能。

降低数据库压力:通过批量写入的方式,将多个写入操作合并为一个,减少数据库的写入次数,减轻数据库压力。

数据最终一致性:数据在最终都会写入数据库,确保数据一致性。

缺点

数据丢失风险:由于写入是异步进行的,可能会导致数据在写入数据库之前丢失,特别是在缓存或应用程序故障的情况下。

数据延迟:数据写入数据库的过程是异步的,可能会导致数据在缓存和数据库之间存在时间差,造成数据延迟问题。

实现复杂:异步写入逻辑会增加系统的复杂性,需要处理错误、重试机制等,以确保数据的最终一致性。

模式比较

下面我们从几个方面对这三种读写模式进行比较:
1.png

这个表格比较了 CacheAside 旁路缓存、Read/Write Through 读写穿透以及 Write Behind Caching 异步缓存写入三种 Redis 读写模式在数据一致性、读写性能、复杂度、适用场景、缓存失效、数据延迟、数据丢失风险和成本等方面的优劣。

END

Redis 的这三种读写模式各有优劣,开发者可以根据业务需求和场景特点选择合适的模式。通过合理选择和使用 Redis 的读写模式,可以提升应用程序的性能和可用性,为用户提供更好的服务体验。希望本文对大家理解 Redis 的读写模式有所帮助!

【更多精彩内容,欢迎关注小米的微信公众号“软件求生”】

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
28天前
|
NoSQL Redis
05- Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略:挥发性 LRU、LFU 和 TTL(针对有过期时间的数据),挥发性随机淘汰,以及全库的 LRU、LFU 随机淘汰,用于在内存不足时选择删除。另外,还有不淘汰策略(no-eviction),允许新写入操作报错而非删除数据。
307 1
|
4天前
|
缓存 监控 NoSQL
Redis缓存雪崩及应对策略
缓存雪崩是分布式系统中一个常见但危险的问题,可以通过合理的缓存策略和系统设计来降低发生的概率。采用多层次的缓存架构、缓存预热、合理的缓存失效时间等措施,都可以有效应对缓存雪崩,提高系统的稳定性和性能。在实际应用中,及时发现并解决潜在的缓存雪崩问题,是保障系统可用性的关键一环。
34 14
|
8天前
|
缓存 NoSQL Java
springboot业务开发--springboot集成redis解决缓存雪崩穿透问题
该文介绍了缓存使用中可能出现的三个问题及解决方案:缓存穿透、缓存击穿和缓存雪崩。为防止缓存穿透,可校验请求数据并缓存空值;缓存击穿可采用限流、热点数据预加载或加锁策略;缓存雪崩则需避免同一时间大量缓存失效,可设置随机过期时间。文章还提及了Spring Boot中Redis缓存的配置,包括缓存null值、使用前缀和自定义过期时间,并提供了改造代码以实现缓存到期时间的个性化设置。
|
8天前
|
缓存 NoSQL 搜索推荐
Redis缓存雪崩穿透等解决方案
本文讨论了缓存使用中的三个问题:缓存穿透、缓存击穿和缓存雪崩。为解决这些问题,提出了相应策略。对于缓存穿透,建议数据校验和缓存空值;缓存击穿可采用监控扩容、服务限流或加锁机制;缓存雪崩则需避免大量缓存同时过期,可设置随机过期时间。此外,文章还介绍了Spring Boot中Redis缓存配置,包括全局设置及自定义缓存过期时间的方法。
|
13天前
|
缓存 NoSQL Redis
揭秘Redis的高效失效策略,提升可用性
Redis是广泛使用的开源内存数据库,其高性能和多样性使其在现代应用中不可或缺。然而,内存限制和数据管理是关键挑战。本文探讨了Redis的失效策略,包括内存淘汰(如LRU和LFU)和缓存失效策略(定时清除、惰性清除和定时扫描清除),以应对内存耗尽、数据过期等问题,确保系统性能和稳定性。通过合理配置这些策略,可以优化内存使用,防止数据不一致,提升系统效率。
36 0
揭秘Redis的高效失效策略,提升可用性
|
13天前
|
存储 缓存 NoSQL
Redis入门到通关之Redis内存淘汰(内存过期)策略
Redis入门到通关之Redis内存淘汰(内存过期)策略
29 3
|
13天前
|
缓存 NoSQL 算法
Redis入门到通过之解决Redis缓存击穿、缓存穿透、缓存雪崩
Redis入门到通过之解决Redis缓存击穿、缓存穿透、缓存雪崩
20 0
|
13天前
|
缓存 NoSQL 算法
Redis 解决缓存雪崩 缓存穿透 缓存击穿(Redis使用必看)
Redis 解决缓存雪崩 缓存穿透 缓存击穿(Redis使用必看)
26 1
|
16天前
|
运维 监控 NoSQL
|
23天前
|
缓存 NoSQL Java
使用Redis进行Java缓存策略设计
【4月更文挑战第16天】在高并发Java应用中,Redis作为缓存中间件提升性能。本文探讨如何使用Redis设计缓存策略。Redis是开源内存数据结构存储系统,支持多种数据结构。Java中常用Redis客户端有Jedis和Lettuce。缓存设计遵循一致性、失效、雪崩、穿透和预热原则。常见缓存模式包括Cache-Aside、Read-Through、Write-Through和Write-Behind。示例展示了使用Jedis实现Cache-Aside模式。优化策略包括分布式锁、缓存预热、随机过期时间、限流和降级,以应对缓存挑战。
http://www.vxiaotou.com