在使用@Cacheable注解的时候,需要注意key的问题,如果key相同,那么在获取缓存的时候是根据key去获取的,所以会出现数据问题。
@Cacheable(value = "test1",key="T(String).valueOf(#current)",cacheManager = "fiveMinutesManager")
@Override
public List<TjLiveDto> test1(int current) {
TjLiveDto tjLiveDto = new TjLiveDto();
tjLiveDto.setId(1L);
tjLiveDto.setTitle("title1");
TjLiveDto tjLiveDto2 = new TjLiveDto();
tjLiveDto2.setId(2L);
tjLiveDto2.setTitle("title2");
return Lists.newArrayList(tjLiveDto,tjLiveDto2);
}
@Cacheable(value = "test2",key="T(String).valueOf(#current)",cacheManager = "fiveMinutesManager")
@Override
public List<LiveDto> test2(int current) {
LiveDto liveDto = new LiveDto();
liveDto.setId(3L);
liveDto.setTeacherTitle("title3");
LiveDto liveDto2 = new LiveDto();
liveDto2.setId(4L);
liveDto2.setTeacherTitle("title4");
return Lists.newArrayList(liveDto,liveDto2);
}
@GetMapping("/test01")
public R testCache1(int current){
return R.ok().put(testTokenBizService.test1(current));
}
@GetMapping("/test02")
public R testCache2(int current){
return R.ok().put(testTokenBizService.test2(current));
}
如上示例代码,他们的value不相等,但是key是相等的,如图是执行结果:
从返回值看,返回的结果是一样的,但是明明是两个接口,怎么会返回相同的结果呢。
初步分析应该是跟key有关系,怀疑从redis中获取值的时候是根据key去获取的,带着疑问查看了源码,记录下分析过程
获取是什么缓存,获取到之后,会放到map中,下次直接从map中获取。
执行具体缓存的方法,这边是redis,那么会进入RedisCache
类,
进入get方法,
进入get方法里面的doLookup
方法,该方法是真正去获取redis的值的方法
调用redis的get命令
从上面的源码可以确定,获取的时候是直接根据key去获取的,所有自定义key的时候需要注意不要重复。
也可以关注我的公众号:程序之声
本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载