一尘不染

如何在spring启动时加载@Cache?

spring

我正在使用spring-cache来改善数据库查询,如下所示可以正常工作:

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

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

但是现在我想在启动时预先填充完整的图书缓存。这意味着我要调用dao.findAll()并将所有值放入缓存。该例程应仅定期进行安排。

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


阅读 707

收藏
2020-04-18

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

确保你KeyGenerator将为一个参数返回对象(默认)。否则,请公开其中的putToCache方法,BookService以避免直接使用cacheManager。

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