问题
在项目启用了ehcache缓存,但是某些方法使用缓存后不能正确的返回数据,抛出了类型转换异常,找了一番资料后发现是缓存的key生成策略问题,在此将此问题及解决办法记录一下。
spring cache缓存的key默认策略
spring cache缓存的key默认是通过KeyGenerator生成的,其默认生成策略如下:
- 如果方法没有参数,则使用0作为key。
- 如果只有一个参数的话则使用该参数作为key。
- 如果参数多余一个的话则使用所有参数的hashCode作为key。
可以看出默认的key生成策略中并没有涉及方法名称和类,这就意味着如果我们有两个参数列表相同的方法,我们用相同的参数分别调用两个方法,当调用第二个方法的时候,spring cache将会返回缓存中的第一个方法的缓存值,因为他们的key是一样的。
下面我们看一段代码:
example code
@CacheConfig(cacheNames = "default")
public class SampleService {
@Cacheable
public Model1 getModel1(Integer id) {
return // ...
}
@Cacheable
public Model2 getModel2(Integer id) {
return // ...
}
}
场景:当我们先调用了getModel1(1),ehcache就会将方法的返回结果以"1"为key放入缓存中,当我们再调用g