java - Spring Boot Redis @Cacheable 方法没有被另一个类调用
问题描述
可能是这些问题似乎与其他问题重复,但我已经检查了其他类似问题并尝试了解决方案,但没有任何效果。
我有一个使用缓存注释注释的服务类,如下所示:
@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 方法没有被调用。
提前致谢
解决方案
在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);
}
推荐阅读
- git - 所有用户跨不同分支提交
- c++ - 我无法使用 C++ 从 mysql 数据库中检索数据
- c++ - 有没有办法创建一对相互包含的模板类?
- python - Pandas - 附加到 CSV,列数不一致
- java - Kakfa Producer - Spring Boot 应用程序 - 无法生成消息
- apache-spark - 以 parquet 格式存储 Spark 数据帧时丢失数据
- c# - NLog中的自定义日志条目字符串格式?
- javascript - 我在 Firebase Cloud 功能中使用 FFMPEG 转换的文件不可访问
- python - 模块调用错误。不能循环输入功能
- c - 如何修改函数内部的多维指针?