使用SpringCache 的@Cacheable失效问题?

作者站长头像
站长
· 阅读数 10

1.现象是接口增加某个参数缓存就会失效(例如下面的Qo类,请求参数加上b缓存就失效,字符长度都排查过,不是这个原因引起的)2.配置都是正确的,去掉b只留a参数就能正常使用缓存

例在某个接口上使用

  @Cacheable(cacheNames = "AAA", keyGenerator="cacheKeyGenerator")
  @GetMapping("/getByQuery")  
  public String  getByQuery(Qo qo){
      xxxxx    
      return xxx;
    }
class Qo{
  private String a;
  private String b
}

下面是自定义key的实现代码

import org.springframework.cache.interceptor.KeyGenerator;
import java.lang.reflect.Method;

import org.springframework.cache.interceptor.SimpleKeyGenerator;
import org.springframework.stereotype.Component;

@Component("cacheKeyGenerator")
public class MethodAwareCacheKeyGenerator implements KeyGenerator {
    @Override
    public Object generate(Object target, Method method, Object... params) {
        String path = generatePath(target, method);
        return SimpleKeyGenerator.generateKey(path, params);
    }

    private String generatePath(Object target, Method method) {
        return target.getClass().getName() + "." + method.getName();
    }
}
回复
1个回答
avatar
test
2024-07-05

给的信息太少了。。缓存失效的现象是啥?传入相同的对象,缓存获取不到?有看一下Redis里面实际的Key情况吗,或者打断点看一下相同对象是否生成了相同的Key?

SimpleKeyGenerator.generateKey(path, params);

path按照目前看到的应该是相同的,那SimpleKey底层应该是根据params的hash来生成的最好的方法还是打个断点追一下,看一下Key生成的情况和Redis实际存入的情况

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容