我在Springboot中使用JSR107缓存。我有以下方法。
@CacheResult(cacheName =“books.byidAndCat”)公共列表< Book> getAllBooks(@CacheKey final String bookId,@ CacheKey final …
我不是Spring上下文中JSR107注释的专家。我使用Spring Cache注释代替。
使用JSR107时,使用的密钥是a GeneratedCacheKey 。这就是你应该放在你的缓存中的东西。不是 toString() 它的。注意 SimpleKeyGenerator 没回来 GeneratedCacheKey 。它返回一个 SimpleKey 这是Spring使用自己的缓存注释而不是JSR-107时使用的密钥。对于JSR-107,你需要一个 SimpleGeneratedCacheKey 。
GeneratedCacheKey
toString()
SimpleKeyGenerator
SimpleKey
SimpleGeneratedCacheKey
然后,如果要预加载缓存,只需调用即可 getAllBooks 在需要它之前。
getAllBooks
如果你想以其他方式预加载缓存,a @javax.cache.annotation.CachePut 应该做的伎俩。请参阅其javadoc示例。
@javax.cache.annotation.CachePut
正如@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()]));