多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

L2Cache快速入门教程:10分钟将Caffeine+Redis二级缓存接入Spring Boot(附完整配置)

L2Cache快速入门教程:10分钟将Caffeine+Redis二级缓存接入Spring Boot(附完整配置) L2Cache快速入门教程10分钟将CaffeineRedis二级缓存接入Spring Boot附完整配置【免费下载链接】l2cacheL2Cache 是一个基于 Caffeine Redis 的二级缓存框架。让缓存的使用在业务开发中更加简单、高效。项目地址: https://gitcode.com/gh_mirrors/l2/l2cacheL2Cache 是一个基于Caffeine Redis的分布式二级缓存框架兼容 Spring Cache 规范。本教程面向新手带你用 10 分钟在 Spring Boot 项目中完成 Caffeine 一级缓存 Redis 二级缓存的混合缓存接入引入 starter 依赖、配置 application.yml、实现一个极简 CacheService 即可开始使用全程无需手写缓存操作细节。一、为什么选择 L2Cache 二级缓存框架自己手写Caffeine Redis 双缓存时你很快会碰到这些问题缓存穿透查不到数据反复打到数据库需要额外存空值缓存击穿热点 key 过期瞬间大量请求同时回源多节点不一致A 节点更新了本地缓存B 节点还是旧值热 key 打爆 Redis单个热点 key 的网络 QPS 压垮 Redis。L2Cache 将这些痛点沉淀成了开箱即用的能力能力说明三级缓存组合仅 Caffeine / 仅 Redis / CaffeineRedis 混合按 cacheName 维度灵活切换缓存穿透防护自动存储空值NullValue并配置空值过期时间缓存击穿防护结合 CaffeinerefreshAfterWrite与synctrue过期后旧值先返回、异步刷新集群一致性通过 Redis 发布订阅或 Kafka在节点间同步失效/更新消息保证最终一致自动热 key 探测支持 Sentinel、jd-hotkey 两种方案自动把热 key 提升到一级缓存批量操作分页的批量 get / 批量淘汰避免大 key 请求 项目已在生产环境支撑单月 10 亿 GMV、全链路 35W QPS 压测稳定性经过大促流量验证。二、三步接入Maven 依赖 参考示例最快接入步骤第 1 步引入 starter 依赖starter 自动装载模式推荐l2cache-spring-boot-starter已发布到 Maven 中央仓库1.x 支持 JDK 82.x 支持 JDK 17dependency groupIdio.github.ck-jesse/groupId artifactIdl2cache-spring-boot-starter/artifactId versionx.x.x/version /dependency第 2 步可选clone 仓库看官方示例完整可运行的 Demo 在仓库的l2cache-example模块中包含注解方式、CacheService 方式、多端口多节点等全部场景git clone https://gitcode.com/gh_mirrors/l2/l2cache第 3 步配置 application.yml见下一节。配置完成后启动应用starter 会自动完成 Caffeine、Redisson、缓存同步策略的初始化无需额外编写启动类代码。⚠️ 自动装配说明Spring Boot 2.x 通过META-INF/spring.factories、Spring Boot 3.x 通过META-INF/spring/...AutoConfiguration.imports注册装配类具体见 l2cache-spring-boot-starter/Readme.md手动装配可用 EnableL2Cache.java 注解开启。三、application.yml 完整配置Caffeine Redis 混合缓存以下是 2.0.0 版本的最小可用配置完整样例参考仓库中l2cache-example/src/main/resources/application.ymll2cache: config: # Redisson 的yaml配置文件 redissonYamlConfig: redisson.yaml # 默认缓存配置 defaultConfig: # 是否存储空值默认true防止缓存穿透 allowNullValues: true # 空值过期时间单位秒 nullValueExpireTimeSeconds: 30 # 是否用一级缓存的过期时间替换二级缓存过期时间默认true简化配置 useL1ReplaceL2ExpireTime: true # 缓存类型caffeine / redis / composite cacheType: COMPOSITE # 组合缓存配置 composite: l1CacheType: caffeine l2CacheType: redis # 一级缓存格式与 Caffeine 官方 spec 完全一致 caffeine: defaultSpec: initialCapacity10,maximumSize200,refreshAfterWrite2m,recordStats # 针对指定缓存名的个性化配置cacheName 维度 specs: userCache: initialCapacity10,maximumSize200,refreshAfterWrite2m,recordStats # 二级缓存 redis: lock: false tryLock: true batchPageSize: 3 # 默认过期时间(ms) expireTime: 86400000 # 缓存同步策略推荐 redis 发布订阅 cacheSyncPolicy: type: redis topic: l2cache核心配置项速查配置项作用建议值cacheType缓存类型支持 caffeine / redis / compositeCOMPOSITE推荐allowNullValues存空值防穿透truerefreshAfterWriteCaffeine 写后刷新防击穿的推荐姿势按业务设定expireTimeRedis 默认过期时间ms按业务设定cacheSyncPolicy.type多节点一致性同步通道redis按需指定缓存类型2.0.0 新增configMap可为每个 cacheName 单独指定类型例如brandCache只走 Caffeine、goodsPriceRevisionCache只走 Redis其余走默认配置——这也是 L2Cache 相对 JetCache、J2Cache 的差异化能力之一动态缓存配置。Redisson 连接配置redisson.yamlsingleServerConfig: address: redis://127.0.0.1:6379 database: 0四、代码中使用实现一个 CacheService 缓存层推荐用法L2Cache 官方推荐的最佳实践是抽象出一个CacheService 缓存层业务代码只调用缓存层的 get/put/evict彻底屏蔽二级缓存细节也避免缓存注解随迭代散落各处。以官方示例 NewBrandCacheService 为模板你只需继承AbstractCacheService并实现缓存名和数据加载方法完整实现见 如何使用L2cache.mdComponent public class NewBrandCacheService extends AbstractCacheServiceInteger, BrandRespBO { public static final String CACHE_NAME newBrandCache; Override public String getCacheName() { return CACHE_NAME; } Override public BrandRespBO queryData(Integer brandId) { // 缓存未命中时执行从 DB 加载数据 return brandMapper.selectById(brandId); } }然后在 Controller 中直接调用参考 NewBrandCacheController.javaRequestMapping(/brand/getOrLoad) public BrandRespBO getOrLoad(Integer brandId) { return newBrandCacheService.getOrLoad(brandId); // 缓存命中直接返回未命中自动加载并写回 }一个 Service 即同时获得一级 Caffeine 读取 → 二级 Redis 读取 → DB 加载回写 → 空值防穿透 → 多节点失效同步 的全部能力还支持batchGet、batchEvict等批量方法。方式二Spring Cache 注解L2Cache 也兼容 Spring Cache 标准注解适合已有注解使用习惯的项目Cacheable(value userCache, key #userId, sync true) public User queryUserSync(String userId) { ... } CachePut(value userCache, key #userId) public User putUser(String userId, User user) { ... } CacheEvict(value userCache, key #userId) public String evictUser(String userId) { ... } 小贴士建议Cacheable始终搭配sync true可借助 Caffeine 的同步加载机制防止缓存击穿。五、进阶L2Cache 如何解决多节点缓存不一致多节点部署时各节点本地缓存的过期时间天然不一致。下图展示了 L2Cache 的处理思路统一过期时间点 过期时通知其他节点避免节点 B 拿到节点 A 已过期数据的问题实现上依赖缓存同步策略缓存更新/淘汰时通过 Redis 发布订阅推荐或 Kafka 向其他节点广播消息其他节点收到后失效本地缓存。选用 Redis pubsub 的考虑复用已有 Redis 中间件少维护一个 MQpubsub 消息不持久化、无消费者时直接丢弃——缓存本身只要求最终一致消费者重启前的消息丢了也无影响下次请求会从 Redis 重新加载到本地。详细配置样例可参考 缓存同步策略配置样例.md。热 key 探测可选在l2cache.config.hotkey下配置type: sentinel并设置规则即可自动识别热点参数并提升到一级缓存降低 Redis 热点压力配置说明见 热key探测-技术方案调研.md。六、常见问题排查启动失败、缓存不生效怎么办现象原因解决方案引入 l2cache 后项目启动失败与项目内 Spring 相关依赖版本冲突排除 l2cache 的spring-boot-starter-web、spring-cloud-context依赖使用项目自身版本缓存穿透不存在的 key 反复查 DB未开启空值存储保持allowNullValues: true并合理设置nullValueExpireTimeSeconds高并发下热点 key 过期瞬间 DB 压力大未利用 Caffeine 异步刷新spec 中配置refreshAfterWrite注解加sync true本地缓存疑似 OOM / 频繁 GCCaffeine 数据量大且命中率极低Caffeine 不适用于海量低命中场景如 3 千万用户的用户维度缓存改用redis或混合模式更多分析见 实战-l2cache高并发场景下出现OOM的分析和优化方案.md接入检查清单✅ pom 中已引入l2cache-spring-boot-starter✅ application.yml 配置了l2cache.configcacheType、caffeine、redis 三块✅ resources 下有 Redisson 连接配置文件✅ 实现了 CacheService或使用了Cacheable注解✅ 多节点部署时配置了cacheSyncPolicy七、总结与延伸阅读用 10 分钟走一遍本文加依赖 → 写配置 → 实现 CacheService你就拥有了带防穿透、防击穿、多节点一致性、热 key 探测能力的生产级二级缓存。 延伸阅读如何使用L2cache.md —— 完整使用手册含多 Redis 实例、批量操作、旧版本配置对照doc/Caffeine简介.md —— 一级缓存 Caffeine 原理速读doc/二级缓存基于注解的最佳实践用法.md —— Spring Cache 注解最佳实践doc/关于缓存的几个常见问题分析和处理方案.md —— 缓存常见问题与处理方案【免费下载链接】l2cacheL2Cache 是一个基于 Caffeine Redis 的二级缓存框架。让缓存的使用在业务开发中更加简单、高效。项目地址: https://gitcode.com/gh_mirrors/l2/l2cache创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表