可能是这些问题似乎与其他问题重复,但我已经检查了其他类似问题并尝试了解决方案,但没有任何效果。
我有一个用缓存注释注释的服务类,如下所示:
@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);
}
}
我正在另一个服务类中 Autowiring CacheFacade。 当我从该类调用 addRequest 时,它可以工作,但是当我调用 getRequest 时,它没有被调用,我尝试在那里添加记录器和调试点,但流程没有到那里。
这是我调用缓存服务类的主要服务类:
@Service
public class RequestHandler {
@Autowired
CacheFacade cacheFac;
}
谁能告诉我我做错了什么以及为什么@cacheput 有效但@cacheable 方法没有被调用。
提前致谢
最佳答案
在 Springboot 中,@Cacheable 注解告诉 spring 缓存这些结果(这是通过代理工作的,所以如果你想读取缓存的结果,用 @Cacheable 注解的方法需要是第一个在您的服务中调用的方法)...我假设它不允许您在那里调试,因为它正在读取缓存的结果?它缓存返回值,而不是整个函数。
所以在这个例子中,第一次用“Jim”调用这个方法时,它会打印 Jim,进行数据库查找,然后返回 5。但是在那之后 spring 记住“Jim”已经是这个方法的参数,所以 spring 知道“Jim”返回 5,而不是再次执行整个方法。它会在缓存被驱逐后再次执行整个方法
@Cacheable
private int method1(String name){
System.out.println(name);
//db lookup
return repo.getId(name);
}
关于java - Spring boot Redis @Cacheable 方法没有被另一个类调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57225029/