Spring Redis Cache没有驱逐

时间:2017-10-11 19:28:45

标签: spring caching redis controller evict

以下作品(执行驱逐的结果):

fooController {
    @ApiEndpoint
    public delete(id) {
        fooService.deleteFoo(id)
    }
}

fooService {
    @CacheEvict(value = "cache1", key = "#id")
    public void deleteFoo(Long id) {
        //delete logic here
    }
}

但这不起作用(没有任何东西从缓存中逐出):

fooController {
    @ApiEndpoint
    public delete(name) {
        fooService.deleteFoo2(name)
    }
}

fooService {
    public void deleteFoo2(String name) {
        //delete logic here
        deleteFoo(name.getId())
    }

    @CacheEvict(value = "cache1", key = "#id")
    public void deleteFoo(Long id) {
        //delete logic here
    }
}

为什么只在从控制器直接调用方法时才调用@CacheEvict注释?

我使用Redis作为缓存机制。

2 个答案:

答案 0 :(得分:1)

当你在课堂内调用你的方法时,Aop并没有动摇。 当方法被另一个类调用时,它正在工作。 所以你可以在另一个服务中定义deleteFoo。

答案 1 :(得分:0)

要使 spring 方面拦截 @Cache* 注释,您必须进行外部调用。如果您不喜欢从另一个对象调用此方法,请使用 bean 自调用 方法。在这种情况下,您的类显示为两个对象,一个调用另一个:

@Resource private FooController thisBean;

public delete(id) {
  thisBean.deleteFoo(id)
}

@CacheEvict(value = "cache1", key = "#id")
public void deleteFoo(Long id) {}