首页 > 其他分享 >Spring 缓存失效经验

Spring 缓存失效经验

时间:2024-02-05 14:22:06浏览次数:24  
标签:缓存 Spring 调用 key 失效 方法

Spring 缓存失效经验

基础背景

Spring 通过代理+切面的方式增强方法实现的 声明式缓存,事务等的支持

通用失效场景

  1. 方法调用为内部调用
  2. 方法未声明为 public 方法

笔者失效场景

  1. key值获取结果不一致。

笔者代码如下所示,方法入参是一个包装对象,缓存key采用方法名+对象的json字符串。
由于该包装对象了为了兼容参数非法。采用部分getter方法调用会修改某些属性值。
而fastjson的序列化操作会调用getter方法为json字段赋值。
最终导致该对象两次调用JSON.toJSONString()得到的结果不一致,进而造成缓存配置失效。

@Cacheable(cacheNames = "customCacheNames", key = "#root.methodName+T(com.alibaba.fastjson.JSON).toJSONString(#param)", unless = "#result==null")
public Object keywordAnalyzer(CustomParam param) {
    return ...;
}

经验总结

没有新的原理,就是Spring的缓存实现调用了两次 key 生成方法。如果只调用一次的话,是不会出现这个问题,暂时懒得看源码,后续看看能不能改下源码或者提个 issue

第一次解析SPEL生成key,去缓存管理器里面判断是否有缓存,有则返回。
没有则调用方法体得到结果,并第二次解析SPEL生成key,将结果放入缓存。

标签:缓存,Spring,调用,key,失效,方法
From: https://www.cnblogs.com/listjiang/p/18007852

相关文章

  • springboot之ImportBeanDefinitionRegistrar动态注入
    SpringBoot中的使用在SpringBoot内置容器的相关自动配置中有一个ServletWebServerFactoryAutoConfiguration类。该类的部分代码如下:@Configuration(proxyBeanMethods=false)@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)@ConditionalOnClass(ServletRequest.class)@Con......
  • Mybatis 的 SqlSession 和一级缓存为什么失效?
    目录SqlSession是什么SqlSession分类SqlSession的创建为什么和Spring整合后的SqlSession一级缓存偶尔会失效一级缓存和二级缓存总结SqlSession是什么SqlSession是Mybatis中定义的,用来表示与关系数据库的一次会话,会话定义了各种具体的操作,查询、数据更新(包含保存、更新、删......
  • Nginx--缓存
    一般存的是静态资源,可以提高客户端的访问速度,并减轻服务器的压力 1 客户端缓存通过设置expires指令,响应头中将会返回Expires和Cache-Control字段当浏览器发现响应头存在这样的缓存字段,当再次请求相同资源时,就会确认在客户端的资源是否过期location/{expires30m......
  • SpringBoot- 文件上传
    packagecom.example.demo.controller;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.multipart.MultipartFile;importjavax.servlet.http.HttpServlet......
  • SpringBoot中使用Spring自带线程池ThreadPoolTaskExecutor与Java8CompletableFuture实
    场景关于线程池的使用:Java中ExecutorService线程池的使用(Runnable和Callable多线程实现):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126242904Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例:https://blog.csdn.net/BADAO_......
  • SpringCloud工程添加openfeign使用服务之间调用
    SpringCloud服务之间的调用可以采用openfeign,今天这里就简单记录下需要做的步骤。前置条件就是微服务都建好了,并且两个服务都注册到nacos上,这里用两个微服务模块。简单描述:请求A模块,然后去调用B模块数据,最后从A模块接口返回。需要在A模块添加openfeign的依赖和service写好接口,B......
  • 阿里二面:SpringBoot可以同时处理多少个请求?当场懵了。。。。
    SpringBoot以其简洁高效的开发方式和强大的内嵌容器特性,为开发者提供了构建高性能后端服务的便利。然而,当面临高并发场景时,理解并合理配置SpringBoot应用以达到最佳的并发处理能力至关重要。在SpringBoot中,应用程序对HTTP请求的并发处理主要依赖于内嵌的Servlet容器(如Tomcat)。接......
  • spring-plugin简单使用
    spring-plugin是spring官方提供的一个插件化设计方案,比如使用支持基于spring的项目项目结构此简单测试项目是一个maven多模块的,包含了一个plugin契约模块,连个插件实现,以及一个bootstrap启动入口代码结构├──README.md├──bootstrap│├──H......
  • SpringBoot实现统一异常处理
    目录前言实现步骤定义统一响应对象类定义业务异常枚举接口和实现定义业务异常基类定义全局异常处理切面测试和验证总结前言近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功......
  • Java Integer包装类缓存(cache)
    ​ Java的Integer类有一个内部的缓存机制,主要用于优化自动装箱(autoboxing)和拆箱(unboxing)的性能。这个特性首次引入于Java5,旨在减少对频繁使用的小整数值的重复对象创建,从而提高性能和减少内存使用。 参数文档:JavaInteger包装类缓存(cache)-CJavaPy1、缓存范围默认情况下,I......