首页 > 解决方案 > 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 方法没有被调用。

提前致谢

标签: javaspring-bootcachingredis

解决方案


在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);
}

推荐阅读