使用SpringCache 的@Cacheable失效问题?

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();

}

}


回答:

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

SimpleKeyGenerator.generateKey(path, params);

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


回答:

你的Qo应该不是这么简单吧,使用SimpleKey的话

    public SimpleKey(Object... elements) {

Assert.notNull(elements, "Elements must not be null");

this.params = new Object[elements.length];

System.arraycopy(elements, 0, this.params, 0, elements.length);

this.hashCode = Arrays.deepHashCode(this.params);

}

其中 params每次都是一个新对象

        System.arraycopy(elements, 0, this.params, 0, elements.length);

这是SimpleKey的toString()方法

    public String toString() {

return this.getClass().getSimpleName() + " [" + StringUtils.arrayToCommaDelimitedString(this.params) + "]";

}

你Qo的toString()是怎么定义的


回答:

你这个不管Qo里面的参数是否一样,生成的key都是不一样的,所以缓存不会生效
至于你说的b参数加了就无效,需要提供更多的代码

以上是 使用SpringCache 的@Cacheable失效问题? 的全部内容, 来源链接: utcz.com/p/945112.html

回到顶部