【问题标题】:Spring boot Redis @Cacheable method not getting called from another classSpring Boot Redis @Cacheable 方法没有被另一个类调用
【发布时间】:2019-12-05 02:14:16
【问题描述】:

可能这些问题似乎与其他问题重复,但我已经检查了其他类似问题并尝试了解决方案,但没有任何效果。

我有一个使用缓存注释注释的服务类,如下所示:

@Service
@CacheConfig(cacheNames={"ReqCache"})
public class ReqCache implements CacheFacade{

    @Autowired
   RequestRepository requestRepo;

    @Cacheable
    public Request getRequest(String sessionId) {
        System.out.println("in cache comp");


        return requestRepo.get(sessionId);
        }

@CachePut(value = "ReqCache", key = "#p0.sessionId")
    public void addRequest(Request request, int partition) {
        requestRepo.add(lterequest,partition);
    }
}

我在另一个服务类中自动装配 CacheFacade。 当我从该类调用 addRequest 时,它可以工作,但是当我调用 getRequest 时,它没有被调用,我尝试在那里添加记录器和调试点,但流程没有去那里。

这是我调用缓存服务类的主要服务类:

@Service
public class RequestHandler {


@Autowired
    CacheFacade cacheFac;
    }

谁能告诉我我做错了什么以及为什么@cacheput 有效但@cacheable 方法没有被调用。

提前致谢

【问题讨论】:

  • 你试过@Cacheable(value = "ReqCache")吗?
  • 那结果呢,是否正确,有没有异常?
  • 在 Springboot 中,@Cacheable 注释告诉 spring 缓存这些结果(仅当注释的方法是该服务中第一个被调用的方法时)......我假设它不允许你在那里调试,因为它正在读取缓存的结果?它缓存返回的值,而不是整个函数
  • @michael 是的,我也试过了..但没用
  • @shadow 它只是给出 null...即使 db 有结果

标签: java spring-boot caching redis


【解决方案1】:

在Springboot中,@Cacheable注解告诉spring缓存那些结果(这是通过代理工作的,所以如果你想读取缓存的结果,需要@Cacheable注解的方法是第一个在您的服务中调用的方法)...我假设它不允许您在那里调试,因为它正在读取缓存的结果?它缓存返回的值,而不是整个函数。

所以在这个例子中,第一次用“Jim”调用这个方法时,它会打印 Jim,做 db 查找,并返回 5。但是在那之后 spring 记得“Jim”已经是这个方法的参数,所以spring知道“Jim”返回5而不是再次执行整个方法。它会在缓存被驱逐后再次执行整个方法

@Cacheable
private int method1(String name){
     System.out.println(name);

     //db lookup
     return repo.getId(name);
}

【讨论】:

  • 感谢 ans 但它至少应该从 db 返回一些结果...它总是返回 null
  • 谢谢你!它实际上只需要成为第一个调用的方法。否则缓存将被忽略。
猜你喜欢
  • 2019-05-08
  • 2020-12-29
  • 1970-01-01
  • 2018-11-30
  • 2013-05-29
  • 2019-01-29
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多