缓存:广义上的缓存,不仅仅指 Redis 这些常用作缓存的工具
命中缓存:指查询操作中直接在缓存中得到结果
数据更新:指同步缓存与数据库中的数据
一.Cache-Aside (旁路缓存)
Cache-Aside Pattern,也称为Lazy-Loading Pattern,业务层负责直接从缓存中读取和写入数据。如果缓存未命中,业务侧从数据库加载数据,同时将数据更新到缓存中。
优点:
- 减少数据库访问,提高了业务处理效率
- 目前spring 3.1开始已支持 Cache ,开发简单
缺点:
- 存在数据一致性问题。
- 存在同一时间大量请求相同数据导致的穿透问题。
二.Read-Through (透读缓存)
Read-Through Pattern是由缓存层负责从数据源(如数据库)加载数据。当业务层请求数据时,如果缓存中存在该数据,则直接返回;如果不存在,则缓存层负责从数据源加载数据,存入缓存,并返回给业务层。
优点:
- 减少数据库访问,提高了业务处理效率
缺点:
- 存在数据一致性问题。
- 存在同一时间大量请求相同数据导致的穿透问题。
三.Write-Through (透写缓存)
Write-Through Pattern是由应用程序在更新数据时同时更新缓存和后端数据源(如数据库)。
优点
- 减少数据库访问,提高了业务处理效率
- 在业务实现策略前提下,可以保证数据一致性
缺点
- 在缓存业务出现异常或数据库保存业务出现异常,可能出现数据一致性问题
- 当缓存业务异常不会从数据库自动加载,可能出现数据库存在但未查到数据的情况。
四.Write-Back / Write-Behind (写后缓存)
Write-Back / Write-Behind Pattern是由业务层首先将数据写入缓存,然后再异步地更新后端数据源(如数据库)。
优点
- 减少数据库访问,提高了业务处理效率
- 在业务实现策略前提下,可以保证数据一致性
- 可以批量异步更新数据库
- 同比与Write-Through (透写缓存),业务处理时间更短
缺点
- 在缓存业务出现异常或数据库保存业务出现异常,可能出现数据一致性问题。
- 当缓存业务异常不会从数据库自动加载,可能出现数据库存在但未查到数据的情况。
- 可能在缓存和数据库更新之间存在较大一段时间间隔,会导致数据一致性问题。
五.Write-Through-Back (透写后缓存)
Write-Through-Back Pattern是结合了Write-Through(透写缓存)和Write-Back / Write-Behind (写后缓存)模式的缓存方法。数据先被写入缓存,再异步地更新到数据库。这种模式旨在平衡写操作的即时性和减少对数据源的直接压力。注:Write-Back通常再写入缓存与数据库存在较大一段时间间隔,Write-Through-Back通常立即执行异步操作,能较大程度减少最终一致性时长
优点
- 减少数据库访问,提高了业务处理效率
- 在业务实现策略前提下,可以保证数据一致性
缺点
- 在缓存业务出现异常或数据库保存业务出现异常,可能出现数据一致性问题。
- 当缓存业务异常不会从数据库自动加载,可能出现数据库存在但未查到数据的情况。
- 批量更新数据可能在缓存和数据库更新之间存在一段时间间隔,相比于Write-Back / Write-Behind (写后缓存),间隔时间要小。
六.Refresh-Ahead (预刷新缓存)
Refresh-Ahead Pattern用于主动刷新即将过期的缓存项。系统会监控缓存数据的过期情况,当缓存数据接近过期时自动从数据源刷新数据。这有助于保持缓存数据的新鲜度,减少缓存未命中的情况,通常也可用于定时刷新不常用的数据减少RPC远程调用的开销
优点
- 减少数据库访问,提高了业务处理效率。
- 保持缓存数据的热度,减少缓存未命中的情况,减少热点数据穿透的可能性。
缺点
- 定期刷新缓存可能会消耗额外的系统资源
- 需要有效的策略决定缓存刷新,消耗更多的开发资源.
七.Lazy-Loading (懒加载)
Lazy-Loading Pattern模式下,数据仅在首次请求时被加载到缓存中,这种设计模式是一种设计指导理念,而不是实现方式。当业务侧请求数据时,如果数据不在缓存中,则从数据源加载数据并将其存储在缓存中。注:Cache-Aside Pattern/Lazy-Loading Pattern(旁路缓存),是Lazy-Loading (懒加载)的一种实现方式。
八.Write-Around (绕写缓存)
Write-Around Pattern数据在更新时先写入数据源(如数据库),再写入缓存。这种设计模式同样是一种设计指导理念,而不是实现方式。