您的位置:首页 >SpringBootCaffeine+Redisson配置二级缓存实践
发布于2026-05-06 阅读(0)
扫一扫,手机访问
在高性能服务架构的设计中,缓存扮演的角色有多关键?相信每一位后端开发者都深有体会。通常,我们会把热点数据丢进Redis或MemCache这类远程缓存里,只有缓存没命中时,才会去查询数据库。这套经典玩法,既能大幅提升访问速度,又能有效给数据库“减负”。
不过,技术架构总是在演进。在某些对性能极其敏感的场景下,光靠远程缓存可能已经不够“快”了。于是,本地缓存(比如Gua va Cache或Caffeine)被引入进来,与远程缓存形成合力,共同将服务的响应性能推向新的高度。这就催生了一种典型的二级缓存架构:本地缓存作为反应最快的一级缓存,远程缓存作为容量更大、更可靠的二级缓存。

要搭建这套体系,首先得把基础组件整合进来。这里以SpringBoot项目为例,需要集成Redisson作为远程缓存,并重写其CacheName的解析逻辑以支持多参数。同时,引入Caffeine作为本地缓存的核心依赖。
com.github.ben-manes.caffeine caffeine
引入本地缓存的核心目的,是为了应对高并发场景下对Redis的频繁查询冲击。来看一个具体的配置:我们设定了expireAfterWrite策略,即最后一次写入或访问后,经过30秒固定时间过期。这意味着,假设一个页面被频繁刷新,在30秒内,无论刷新多少次,请求都会命中本地缓存。而且,即便在第29秒重新获取了数据,这个30秒的过期计时也会重新开始计算。
通过@EnableCaching注解来开启Spring的缓存功能,这个注解可以加在配置类上,也可以直接放在应用启动类上。
package com.example.redisson.config;
import com.example.redisson.manager.PlusSpringCacheManager;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ja va.util.concurrent.TimeUnit;
/**
* 缓存配置
*
* @author Lion Li
*/
@Configuration
@EnableCaching
public class CacheConfig {
/**
* caffeine 本地缓存处理器
*/
@Bean
public Cache
实现二级缓存的关键,在于如何优雅地让两者协同工作。这里采用装饰器模式对原有的Cache进行包装,有几个细节需要特别注意:
put方法会自动加上cacheNames前缀。cacheNames,它的getcacheNames下可能存在的key冲突问题,代码中增加了getUniqueKey方法,其核心逻辑是将cacheNames(通过getName()获得)与原始key拼接,形成一个全局唯一的键。简单来说,一个CacheName就对应一个被装饰的Cache对象。
package org.dromara.common.redis.manager;
import cn.hutool.core.lang.Console;
import org.dromara.common.core.utils.SpringUtils;
import org.springframework.cache.Cache;
import ja va.util.concurrent.Callable;
/**
* Cache 装饰器模式(用于扩展 Caffeine 一级缓存)
*
* @author Lion Li
*/
public class CaffeineCacheDecorator implements Cache {
private static final com.github.benmanes.caffeine.cache.Cache

配置完成后,在业务代码中的使用方式就非常直观了。直接使用Spring标准的@Cacheable注解即可。
@Cacheable(cacheNames = "demo:cache#60s#10m#20", key = "#key", condition = "#key != null")
@GetMapping("/test1")
public R test1(String key, String value) {
System.out.println("test1-->调用方法体");
return R.ok("操作成功", value);
}
这里有个关键点:@Cacheable注解在方法执行前就会触发get操作,因此能够顺利激活我们设计好的二级缓存链路。而@CachePut注解是执行方法后再放入缓存,因此其逻辑略有不同。

从上面的调用流程示意图可以清晰看到,请求会先查询一级本地缓存,如果未命中,则继续查询二级远程缓存。这正好印证了查看源码得出的结论:数据获取遵循“先本地,后远程”的优先级顺序。

为了更方便地操作缓存,通常会封装一个工具类。下面这个工具类提供了对缓存组的键、值进行增删改查的通用方法。
package com.example.redisson.utils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.redisson.api.RMap;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import ja va.util.Set;
/**
* 缓存操作工具类 {@link }
*
* @author Michelle.Chung
* @date 2022/8/13
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@SuppressWarnings(value = {"unchecked"})
public class CacheUtils {
private static final CacheManager CACHE_MANAGER = SpringUtils.getBean(CacheManager.class);
/**
* 获取缓存组内所有的KEY
*
* @param cacheNames 缓存组名称
*/
public static Set
总的来说,通过装饰器模式整合Caffeine与Redisson,是实现SpringBoot项目二级缓存的一个清晰且有效的方案。它既保留了Spring Cache标准API的简洁性,又通过本地缓存极大提升了高频访问数据的读取性能。希望这套实践思路和具体代码,能为大家在构建高性能服务时提供一个可靠的参考。
您可能感兴趣的文章:
上一篇:Android字体字重设置全攻略
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8