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

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

逻辑图.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分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7天前
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略,分为淘汰易失数据和淘汰全库数据两大类。易失数据淘汰策略包括:volatile-lru、volatile-lfu、volatile-ttl 和 volatile-random;全库数据淘汰策略包括:allkeys-lru、allkeys-lfu 和 allkeys-random。此外,还有 no-eviction 策略,禁止驱逐数据,当内存不足时新写入操作会报错。
37 16
|
6天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
7天前
|
存储 NoSQL Redis
Redis的数据过期策略有哪些 ?
Redis 采用两种过期键删除策略:惰性删除和定期删除。惰性删除在读取键时检查是否过期并删除,对 CPU 友好但可能积压大量过期键。定期删除则定时抽样检查并删除过期键,对内存更友好。默认每秒扫描 10 次,每次检查 20 个键,若超过 25% 过期则继续检查,单次最大执行时间 25ms。两者结合使用以平衡性能和资源占用。
29 11
|
9天前
|
设计模式 NoSQL Go
Redis 实现高效任务队列:异步队列与延迟队列详解
本文介绍了如何使用 Redis 实现异步队列和延迟队列。通过 Go 语言的 `github.com/go-redis/redis` 客户端,详细讲解了 Redis 客户端的初始化、异步队列的实现和测试、以及延迟队列的实现和测试。文章从基础连接开始,逐步构建了完整的队列系统,帮助读者更好地理解和应用这些概念,提升系统的响应速度和性能。
27 6
|
18天前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
52 10
|
18天前
|
缓存 监控 NoSQL
Redis 缓存穿透的检测方法与分析
【10月更文挑战第23天】通过以上对 Redis 缓存穿透检测方法的深入探讨,我们对如何及时发现和处理这一问题有了更全面的认识。在实际应用中,我们需要综合运用多种检测手段,并结合业务场景和实际情况进行分析,以确保能够准确、及时地检测到缓存穿透现象,并采取有效的措施加以解决。同时,要不断优化和改进检测方法,提高检测的准确性和效率,为系统的稳定运行提供有力保障。
47 5
|
18天前
|
缓存 监控 NoSQL
Redis 缓存穿透及其应对策略
【10月更文挑战第23天】通过以上对 Redis 缓存穿透的详细阐述,我们对这一问题有了更深入的理解。在实际应用中,我们需要根据具体情况综合运用多种方法来解决缓存穿透问题,以保障系统的稳定运行和高效性能。同时,要不断关注技术的发展和变化,及时调整策略,以应对不断出现的新挑战。
41 4
|
1月前
|
消息中间件 缓存 NoSQL
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
51 2
|
1月前
|
缓存 分布式计算 NoSQL
大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念
大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念
62 2
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)

相关产品

  • 云数据库 Tair(兼容 Redis)