【问题标题】:Spring Redis Cache not evictingSpring Redis 缓存不驱逐
【发布时间】:2018-03-23 14:13:15
【问题描述】:

以下工作(导致执行驱逐):

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 作为缓存机制。

【问题讨论】:

    标签: spring caching redis controller evict


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      @Resource private FooController thisBean;
      
      public delete(id) {
        thisBean.deleteFoo(id)
      }
      
      @CacheEvict(value = "cache1", key = "#id")
      public void deleteFoo(Long id) {}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 2014-10-12
        • 2016-09-10
        • 2011-11-11
        • 2020-10-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多