CacheResolver 和 KeyGenerator 之间有什么区别以及何时分别使用它们
What is the difference between CacheResolver and KeyGenerator and when to use each one of them
我正在向我的 Web 应用程序添加缓存机制。
经过研究,我决定将 Ehcache
与 Spring 一起使用。
向方法添加 @Cachable
注释将执行该方法一次,对于任何进一步的调用,响应将从缓存中返回。
问题是我需要在运行时决定(假设根据登录用户)我想使用哪个缓存。
我已经到了需要决定是使用 KeyGenerators
还是 cacheResolver
的地步。
我搜索了最佳实践,何时使用它们中的每一个,但没有找到任何好的读物。我希望如果有人能澄清差异并详细说明最佳做法以及应该做和不应该做的事情。
密钥生成器:
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object o, Method method, String loggedInUserId) {
StringBuilder sb = new StringBuilder();
sb.append("cache_");
sb.append(loggedInUserId);
return sb;
}
};
缓存解析器
class loggedInUserCacheResolver implements CacheResolver {
@Override
public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {
Collection<Cache> caches = new ArrayList<>();
// do some logic and return caches to use.
return caches;
}
}
KeyGenerator
将只允许您操纵缓存键的创建。但是 所有 键仍然属于一个缓存,即使它们不会发生任何冲突。
CacheResolver
允许您使用逻辑来选择要使用的 Cache
。
鉴于您的初始陈述,您需要 CacheResolver
用于您的用例。请注意,我没有仔细检查缓存是否已解析 once 或 each 调用。
请注意,您可以将这两个注释组合起来以拥有自定义缓存和自定义键定义。
我正在向我的 Web 应用程序添加缓存机制。
经过研究,我决定将 Ehcache
与 Spring 一起使用。
向方法添加 @Cachable
注释将执行该方法一次,对于任何进一步的调用,响应将从缓存中返回。
问题是我需要在运行时决定(假设根据登录用户)我想使用哪个缓存。
我已经到了需要决定是使用 KeyGenerators
还是 cacheResolver
的地步。
我搜索了最佳实践,何时使用它们中的每一个,但没有找到任何好的读物。我希望如果有人能澄清差异并详细说明最佳做法以及应该做和不应该做的事情。
密钥生成器:
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object o, Method method, String loggedInUserId) {
StringBuilder sb = new StringBuilder();
sb.append("cache_");
sb.append(loggedInUserId);
return sb;
}
};
缓存解析器
class loggedInUserCacheResolver implements CacheResolver {
@Override
public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {
Collection<Cache> caches = new ArrayList<>();
// do some logic and return caches to use.
return caches;
}
}
KeyGenerator
将只允许您操纵缓存键的创建。但是 所有 键仍然属于一个缓存,即使它们不会发生任何冲突。
CacheResolver
允许您使用逻辑来选择要使用的 Cache
。
鉴于您的初始陈述,您需要 CacheResolver
用于您的用例。请注意,我没有仔细检查缓存是否已解析 once 或 each 调用。
请注意,您可以将这两个注释组合起来以拥有自定义缓存和自定义键定义。