多级缓存架构实战:Caffeine+Redis

server/2025/3/13 23:14:21/

一、架构演进与核心价值

1.1 性能对比数据
在这里插入图片描述

1.2 协同设计优势
在这里插入图片描述

二、实战案例:电商商品详情页优化

2.1 痛点分析
原始架构:单层 Redis 缓存
问题现象:

# 压测数据
Requests/sec: 58000
99% latency: 120ms
Redis CPU Usage: 85%

2.2 架构改造方案
核心依赖(Spring Boot)

<!-- Caffeine依赖 -->
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId>
</dependency><!-- Redis依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

缓存配置

@Configuration
public class CacheConfig {// 本地缓存配置(Caffeine)@Beanpublic CacheManager caffeineCache() {return Caffeine.newBuilder().expireAfterWrite(5, TimeUnit.SECONDS)  // 短周期防穿透.maximumSize(1000).build();}// 分布式缓存配置(Redis)@Beanpublic RedisCacheManager redisCache(RedisConnectionFactory factory) {return RedisCacheManager.builder(factory).expireAfter(30, TimeUnit.SECONDS).build();}
}

服务层实现

@Service
public class ProductService {@Cacheable(value = "product", key = "#id", cacheManager = "caffeineCache")public Product getProduct(Long id) {return redisTemplate.opsForValue().get("product:" + id);}@CachePut(value = "product", key = "#result.id", cacheManager = "redisCache")public Product updateProduct(Product product) {// 更新数据库和Redisreturn product;}
}

三、一致性保障策略

3.1 缓存更新模式

// 双写策略
public void updateProductStock(Long productId, int delta) {// 1. 更新数据库productMapper.updateStock(productId, delta);// 2. 更新RedisredisTemplate.opsForValue().set("product:" + productId, updatedProduct);// 3. 逐出Caffeine缓存caffeineCache.evict(productId);
}

3.2 穿透/雪崩防护

// 空值防护策略
public Product getProduct(Long id) {Product product = caffeineCache.getIfPresent(id);if (product == null) {product = redisTemplate.opsForValue().get("product:" + id);if (product == null) {product = DB.get(id);if (product == null) {product = NULL_PRODUCT;  // 特殊空对象}redisTemplate.opsForValue().set("product:" + id, product, 60, SECONDS);}caffeineCache.put(id, product);}return product == NULL_PRODUCT ? null : product;
}

四、性能压测与调优

4.1 压测结果
在这里插入图片描述

4.2 JVM 参数优化

# 优化GC配置
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:InitiatingHeapOccupancyPercent=35

五、落地 Checklist

5.1 监控体系

# Prometheus监控指标
-pattern:"cache_hits_total"
name:"caffeine_cache_hits"
labels:tier:"local"
-pattern:"redis_cache_hits"
labels:tier:"distributed"

5.2 降级策略

// 降级开关
@HystrixCommand(fallbackMethod = "getProductFallback")
public Product getProduct(Long id) {// 正常逻辑
}public Product getProductFallback(Long id) {return localCache.getIfPresent(id);  // 降级到本地缓存
}

5.3 冷启动策略

// 预热脚本
@PostConstruct
public void warmUpCache() {List<Long> hotIds = productMapper.selectHotIds(1000);hotIds.parallelStream().forEach(id ->caffeineCache.put(id, productMapper.selectById(id)));
}

六、总结与思考

架构设计三原则:

  • 速度优先:Caffeine 处理 80%热数据
  • 容量分层:Redis 存储全量数据
  • 最终一致:通过 MQ 实现异步同步

未来演进:

  • 结合 Service Mesh 实现无侵入缓存
  • 利用 eBPF 技术实现内核级缓存
  • 探索存算分离架构

http://www.ppmy.cn/server/174743.html

相关文章

CI/CD—Jenkins、Maven安装

Jenkins简介 Jenkins 是一款广泛使用的开源持续集成和持续交付&#xff08;CI/CD&#xff09;工具&#xff0c;以下是对它的详细介绍&#xff1a; 基本信息 起源与发展&#xff1a;Jenkins 最早起源于 Hudson 项目&#xff0c;后来从 Hudson 项目中分离出来独立发展。自 2011 …

网络安全之tcpdump工具

引言 wireshark是一款非常不错的抓包软件&#xff0c;在图形化界面占绝对统治地位&#xff1b;尽管其在字符界面下有些许选项可供使用&#xff0c;但终究不太方便&#xff0c;下面我再介绍一款NB的终端抓包工具 tcpdump 1、混杂模式 linux的网卡有混杂模式一说&#xff0c;当开…

CUDA编程之OpenCV与CUDA结合使用

OpenCV与CUDA的结合使用可显著提升图像处理性能。 一、版本匹配与环境配置 CUDA与OpenCV版本兼容性‌ OpenCV各版本对CUDA的支持存在差异&#xff0c;例如OpenCV 4.5.4需搭配CUDA 10.0‌2&#xff0c;而较新的OpenCV 4.8.0需使用更高版本CUDA‌。 需注意部分模块&#xff08;…

Python实现网络通信:Socket模块与TCP/IP协议全解析

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

【web前端开发】HTML排版标签、HTML语义化标签、常用的文本标签

1、HTML排版标签 标签名 标签含义 单/双标签 h1~h6 …

批量将 Excel 转换 PDF/Word/CSV以及图片等其它格式

Excel 格式转换是我们工作过程当中非常常见的一个需求&#xff0c;我们通常需要将 Excel 转换为其他各种各样的格式。比如将 Excel 转换为 PDF、比如说将 Excel 转换为 Word、再比如说将 Excel文档转换为图片等等。 这些操作对我们来讲都不难&#xff0c;因为我们通过 Office 都…

Kubernetes开发环境minikube | 开发部署apache tomcat web集群应用

minikube是一个主要用于开发与测试Kubernetes应用的运行环境&#xff0c;本文主要描述在minikube运行环境中部署J2EE tomcat web应用。 单节点Node多Pod实例部署 如上所示&#xff0c;在minikube运行的Linux部署环境中启动单节点Node 如上所示&#xff0c;在minikube的容器环境…

GitHub上传项目

总结&#xff08;有基础的话直接执行这几步&#xff0c;就不需要再往下看了&#xff09;&#xff1a; git init 修改git的config文件&#xff1a;添加:[user]:name你的github用户名 email你注册github的用户名 git branch -m master main git remote add origin 你的URL gi…