如何在春季启动时加载@Cache?

2022-09-02 23:17:30

我正在使用spring缓存来改进数据库查询,它的工作原理如下:

@Bean
public CacheManager cacheManager() {
    return new ConcurrentMapCacheManager("books");
}

@Cacheable("books")
public Book getByIsbn(String isbn) {
    return dao.findByIsbn(isbn);
}

但现在我想在启动时预填充完整的书籍缓存。这意味着我想调用所有值并将其放入缓存中。这一例行程序不应只是定期安排。dao.findAll()

但是,在使用时如何显式填充缓存?@Cacheable


答案 1

只需像以前一样使用缓存,添加调度程序来更新缓存,代码片段如下。

@Service
public class CacheScheduler {
    @Autowired
    BookDao bookDao;
    @Autowired
    CacheManager cacheManager;

    @PostConstruct
    public void init() {
        update();
        scheduleUpdateAsync();
    }

    public void update() {
        for (Book book : bookDao.findAll()) {
            cacheManager.getCache("books").put(book.getIsbn(), book);
        }
    }
}

确保将返回一个参数的对象(默认)。否则,请公开该方法以避免直接使用 cacheManager。KeyGeneratorputToCacheBookService

@CachePut(value = "books", key = "#book.isbn")
public Book putToCache(Book book) {
    return book;
}

答案 2

我在使用@PostConstruct时遇到了以下问题: - 即使调用了我想要缓存的方法,从swagger调用它后,它仍然没有使用缓存的值。只有在再次调用它之后。

这是因为@PostConstruct对于缓存某些内容来说还为时过早。(至少我认为这是问题所在)

现在我在启动过程的后期使用它,它可以毫无问题地工作:

@Component
public class CacheInit implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
       //call service method
    }

}

推荐