使用Spring Boot和自定义缓存注解优化应用性能
创作时间:
作者:
@小白创作中心
使用Spring Boot和自定义缓存注解优化应用性能
引用
CSDN
1.
https://blog.csdn.net/qq_21299835/article/details/140237793
在现代应用开发中,缓存是提高系统性能和响应速度的关键技术之一。Spring Boot提供了强大的缓存支持,但有时我们需要更灵活的缓存控制。本文将介绍如何使用Spring Boot和自定义缓存注解来优化应用性能。
为什么需要自定义缓存注解?
Spring Boot提供了@Cacheable、@CachePut和@CacheEvict等注解来管理缓存,但有时这些注解可能无法满足特定需求。例如,你可能需要更细粒度的缓存控制,或者希望在缓存中存储自定义数据结构。这时,自定义缓存注解就显得尤为重要。
创建自定义缓存注解
首先,我们需要创建一个自定义的缓存注解。这个注解将允许我们指定缓存的键和过期时间。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CustomCacheable {
/**
* 缓存名称
* @return
*/
String key() default "";
/**
* 缓存条件
* @return
*/
String condition() default "";
/**
* 过期时间,单位秒
*/
long expireTime() default 0;
}
创建缓存切面
接下来,我们需要创建一个切面来处理自定义缓存注解。这个切面将拦截带有自定义缓存注解的方法,并根据注解的参数进行缓存操作。
@Aspect
@Component
public class CustomCacheAspect {
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Around("@annotation(customCacheable)")
public Object cache(ProceedingJoinPoint joinPoint, CustomCacheable customCacheable) throws Throwable {
String key = customCacheable.key();
long expireTime = customCacheable.expireTime();
//获取方法名及参数值
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
// 构建缓存键
key = key + ":" + methodName;
if (args != null && args.length > 0) {
for (Object arg : args) {
key = key + ":" + arg;
}
}
//获取方法参数名
// String[] parameterNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames();
// if (parameterNames != null) {
// for (int i = 0; i < parameterNames.length; i++) {
// key = key + ":" + args[i];
// }
// }
// 尝试从缓存中获取数据
Object cachedValue = redisTemplate.opsForValue().get(key);
if (cachedValue != null) {
return cachedValue;
}
// 如果缓存中没有数据,则执行方法并将结果存入缓存
Object result = joinPoint.proceed();
if(expireTime > 0){
redisTemplate.opsForValue().set(key, result, expireTime, TimeUnit.SECONDS);
}else{
redisTemplate.opsForValue().set(key, result);
}
return result;
}
}
配置RedisTemplate
为了在切面中使用RedisTemplate,我们需要进行相应的配置。
注:这里RedisConnectionFactory Bean 可不配,不过会有提示,看着不爽。
@Configuration
public class RedisConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(); // 或者使用JedisConnectionFactory等其他实现
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
这里使用的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.7.0</version>
</dependency>
使用自定义缓存注解
最后,我们可以在服务类中使用自定义缓存注解,这里使用的上一篇生成的代码测试一下。
/**
* 根据id查询
*/
@GetMapping("/{id}")
@CustomCacheable(key = "user")
public UserTest getById(@PathVariable Long id) {
return userTestService.getById(id);
}
启用AOP支持
确保在你的Spring Boot应用中启用了AOP支持。你可以在application.properties中添加以下配置:
spring.aop.auto=true
或者在启动类上添加@EnableAspectJAutoProxy注解:
@SpringBootApplication
@EnableAspectJAutoProxy
public class AppStart {
public static void main(String[] args){
SpringApplication.run(AppStart.class, args);
}
}
测试
总结
通过自定义缓存注解和切面,我们可以在Spring Boot应用中实现更灵活的缓存控制。这不仅提高了应用的性能,还使得缓存管理更加便捷和高效。希望本文对你在Spring Boot应用中实现自定义缓存有所帮助。
热门推荐
《PNAS》杂志发表大规模研究:揭示高生育率与女性衰老的关联
通榆特等功臣赵树满孙女赵威:从儿时讲爷爷的红色故事
三文鱼第二天还能吃吗?保存方法与食用安全全攻略
无桥PFC的电路结构与功率因数提升方法
美食美景两相宜,昆山周末逛吃指南!
豆类虽好但有产气问题?中医智慧来化解胀气

汽车以旧换新政策,利好市场还是消费者?
每天喝豆浆和每天喝牛奶的人,谁会更长寿?哈佛研究公布答案
《美国队长4》口碑翻车评分2.9,《哪吒2》在北美真实排片曝光
你绝对不能错过的8道顺德粤菜,真的让人误以为你是本地人!
企业如何发布招聘信息:从平台选择到后续管理的全流程指南
如何恢复手机回收站里已删除的照片?
2024年国有大行高管变动盘点:工行、建行董事长行长均有调整,邮储高管团队最稳定
武汉公办中专中职学校排名榜(2025年最新)
网络共享打印机脱机状态怎么办?5个排查步骤轻松解决
除草剂可以和芸苔素一起用吗?
牛奶和豆浆,到底哪个更有营养?
爱因斯坦:时间只是大脑的幻觉
从跳跳男到篮球巨星,22岁阿门汤普森的未来一片光明
从意外收获看个人成长路径
已有窗帘怎么加遮光布
如何让宝宝学会用杯子喝水?学会这5个方法,让宝宝轻松用水杯
以摸猫咪它摇尾巴为乐——深入了解宠物行为的意义(研究显示)
如何用识别出的文字替换扫描版PDF中的原文字
如何让孩子爱上喝水?
日本看护杀人案暴增,绝望的不止老人
狗狗换牙期护理全攻略:从症状到应对措施,新手铲屎官必读
狗狗几个月大时换牙?换牙期的正确护理方法是什么?
人工智能的零数据、小数据、大数据和全数据方法
10部引人深思的科幻电影,有着烧脑的结局