缓存Jcache的关键问题

时间:2018-05-24 19:48:54

标签: spring-boot ehcache spring-cache jcache jsr107

我在Springboot中使用JSR107缓存。我有以下方法。

@CacheResult(cacheName = "books.byidAndCat")
public List<Book> getAllBooks(@CacheKey final String bookId, @CacheKey final BookCategory bookCat) {

return <<Make API calls and get actual books>>
}

第一次进行实际的API调用,第二次加载缓存没有问题。我可以看到日志的以下部分。

Computed cache key SimpleKey [cb5bf774-24b4-41e5-b45c-2dd377493445,LT] for operation CacheResultOperation[CacheMethodDetails ...

但问题是我想加载缓存而不进行第一次API调用,只需填写如下的缓存。

String cacheKey  = SimpleKeyGenerator.generateKey(bookId, bookCategory).toString();     
        cacheManager.getCache("books.byidAndCat").put(cacheKey, deviceList);

当我检查时,cachekeys的哈希码在两种情况下都是相同的,但它正在进行API调用。如果哈希码在两种情况下都相同,为什么它在不考虑缓存的情况下进行API调用?

当调试spring类时,org.springframework.cache.interceptor.SimpleKeyGenerator与缓存密钥生成一起使用甚至@CacheResult就在那里。 编辑并增强问题:

除此之外,如果getAllBooks重载方法,然后通过单独的重载方法调用此缓存方法,那么方法缓存也不起作用。

2 个答案:

答案 0 :(得分:1)

我不是Spring上下文中JSR107注释的专家。我使用Spring Cache注释。

使用JSR107时,使用的密钥是toString()。这就是你应该放在你的缓存中的东西。不是它的SimpleKeyGenerator。请注意,GeneratedCacheKey未返回SimpleKey。它返回一个SimpleGeneratedCacheKey,这是Spring在使用自己的缓存注释而不是JSR-107时使用的密钥。对于JSR-107,您需要getAllBooks

然后,如果您想预加载缓存,只需在需要之前调用@javax.cache.annotation.CachePut

如果您想以其他方式预加载缓存,{{1}}应该可以解决问题。请参阅其javadoc示例。

答案 1 :(得分:0)

正如@Henri建议的那样,我们可以使用cacheput。但为此,我们需要方法。通过以下我们可以更新缓存非常类似于cacheput,

//重载方法id和cat都可用。

List<Object> bookIdCatCache = new ArrayList<>();
    bookIdCatCache.add(bookId);
    bookIdCatCache.add(deviceCat);
    Object bookIdCatCacheKey  = SimpleKeyGenerator.generateKey(bookIdCatCache.toArray(new Object[bookIdCatCache.size()]));
    cacheManager.getCache("books.byidAndCat").put(bookIdCatCacheKey , bookListWithIdAndCat);

//重载方法只有ID

List<Object> bookIdCache = new ArrayList<>();
        String nullKey          = null
        bookIdCache.add(bookId);
        bookIdCache.add(nullKey);
        Object bookIdCacheKey  = SimpleKeyGenerator.generateKey(bookIdCache.toArray(new Object[bookIdCache.size()]));
        cacheManager.getCache("books.byidAndCat").put(bookIdCacheKey , bookListWithId);

//不正确(我之前的实施)

String cacheKey  = SimpleKeyGenerator.generateKey(bookId, bookCategory).toString();

//正确(这是从春天开始)

Object cacheKey  = SimpleKeyGenerator.generateKey(bookIdCatCache.toArray(new Object[bookIdCatCache.size()]));