@Cacheable中key重复问题

  |   0 评论   |   48 浏览

在使用@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是相等的,如图是执行结果:
image.png
image.png
从返回值看,返回的结果是一样的,但是明明是两个接口,怎么会返回相同的结果呢。
初步分析应该是跟key有关系,怀疑从redis中获取值的时候是根据key去获取的,带着疑问查看了源码,记录下分析过程
image.png
获取是什么缓存,获取到之后,会放到map中,下次直接从map中获取。
image.png
执行具体缓存的方法,这边是redis,那么会进入RedisCache类,
image.png
进入get方法,
image.png
进入get方法里面的doLookup方法,该方法是真正去获取redis的值的方法
image.png
调用redis的get命令

从上面的源码可以确定,获取的时候是直接根据key去获取的,所有自定义key的时候需要注意不要重复。
也可以关注我的公众号:程序之声
图片
关注公众号,领取更多资源

本文为博主原创文章,未经博主允许不得转载。

评论

发表评论