记一次SpringBoot中@Cacheable不生效的解决

记一次SpringBoot中@Cacheable不生效的解决

最近做项目遇到一个性能瓶颈,数据库两张表100多万数据级联查询,非常慢,特别是涉及到分页这块,自己用explain查看执行计划,由于条件很多,加索引优化也没生效,故使用缓存的方式解决,但有一个缓存一直不生效,自己看了一下源码打断点看执行方法,最终解决了,记录一下我的方法,希望对你有用(最后发现主要问题是我两个方法使用同一个map作为key,导致后面key覆盖了前面key所以一直取不到正确的数据)

首先找到spring-context的jar包,找到里面的CacheInterceptor类,找到里面的invoke初始化方法
在这里插入图片描述
可以看到这里最下面调用了excute方法执行,点进去,到CacheAspectSupport类中,这个时候看excute
在这里插入图片描述
直接点到return里面的execute方法,这个事初化主方法,基本查找和存取都在这个里面

    @Nullable
	private Object execute(final CacheOperationInvoker invoker, Method method, CacheOperationContexts contexts) {
		// Special handling of synchronized invocation
		if (contexts.isSynchronized()) {
			CacheOpera
@Cacheable注解是Spring框架中用于缓存方法返回结果的注解。当一个方法被@Cacheable注解标后,Spring会检查缓存中是否存在该方法的返回值,如果存在,则直接从缓存中获取结果并返回;如果不存在,则执行方法体,并将返回值存入缓存中。 使用@Cacheable注解需要注意以下几点: 1. 在需要缓存结果的方法上使用@Cacheable注解。 2. 可以指定缓存的名称,通过value属性来指定,如:@Cacheable(value="myCache")。 3. 可以指定缓存的Key,通过key属性来指定,如:@Cacheable(key="#param")。其中#param表示方法的参数值,还可以使用SpEL表达式来动态构建key。 4. 默认情况下,缓存的Key是由方法的所有参数组成的,如果不希望使用所有参数构建Key,可以使用condition属性来限制条件,如:@Cacheable(condition="#param.length() < 10")。这里的condition表示只有当参数长度小于10时才进行缓存。 5. 可以指定缓存的过期时间,通过设置expire属性来指定,如:@Cacheable(expire=3600)。单位为秒,默认为-1,表示永不过期。 示例代码: ```java @Service public class UserService { @Cacheable(value = "users", key = "#id") public User getUserById(String id) { // 从数据库中获取用户信息 // ... return user; } } ``` 上述示例中,getUserById方法会根据id参数从缓存中获取User对象,如果缓存中不存在,则执行方法体并将返回值存入缓存。 需要注意的是,@Cacheable注解只能用于Spring容器管理的Bean中,即被@Service、@Component等注解标的类中的方法才能被缓存。另外,为了使@Cacheable注解生效,需要在Spring配置文件中配置缓存管理器(如使用Ehcache、Redis等)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值