浅谈--Cache Design Pattern

🤔听说你用过Redis、Caffeine,那我问你你了解Cache Design Pattern吗?Look at my eyes。

今天就来聊聊Cache Design Pattern。Cache Design Pattern是缓存设计模式,是用于优化系统性能、减少资源消耗和提升响应速度的软件架构策略。主要有六大核心缓存模式。

Cache-Aside

又名旁路缓存,博主我捏最喜欢的一个模式,也是用得最多的一个模式。

原理

核心思想:应用层直接管理缓存,未命中的从数据库加载并写入缓存。

image.png

适应场景:读多写少,而且可以搭配布隆过滤器(神器)

Read-Through

又叫读穿透

原理

核心思想:缓存层自动护理数据加载,应用层只与缓存交互。

// 配置缓存加载器(CacheLoader)
LoadingCache<String, User> userCache = CacheBuilder.newBuilder()
    .maximumSize(1000)
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .build(new CacheLoader<String, User>() {
        public User load(String userId) {
            return db.loadUser(userId);  // 自动加载未命中数据
        }
    });

适用场景:缓存作为数据访问的唯一抽象层

Write-Thrugh

又叫写穿透

原理

核心原理:数据写入同步更新缓存层和持久层,确保强一致性。

适用场景:对数据一致性要求高的场景。

缺点:写入延迟高

Write-Behind

又称为写回

原理

核心原理:数据先写入缓存,然后异步更新持久层。(一般搭配消息队列使用)


使用场景:高吞吐量写入场景(当然有数据丢失的可能性,所以一盘搭配MQ使用)

Refresh-Ahead

又叫预刷新机制。

原理

在缓存过期前主动刷新缓存,避免缓存过期后的请求风暴。

// Caffeine缓存配置示例
LoadingCache<String, Data> cache = Caffeine.newBuilder()
    .expireAfterWrite(5, TimeUnit.MINUTES)
    .refreshAfterWrite(4, TimeUnit.MINUTES)  // 提前1分钟刷新
    .build(key -> loadDataFromSource(key));

适应场景:数据变化频繁但允许短暂不一致(新闻热点)

Cache-AS-SOR

又叫缓存即数据源。

原理

核心思想:以缓存作为唯一数据源,持久层只做备份。

适应场景:做热点排行榜

posted @ 2025-03-25 22:25  ayu0v0  阅读(47)  评论(0)    收藏  举报