遇到番石榴缓存问题
Facing issue with Guava Cache
我正在使用 Google 番石榴缓存 + Spring 缓存抽象用于缓存目的。
我正在尝试使用 Guava 的 Loading Cache 接口。
我知道 Spring 提供对 Guava Cache 的支持,但我想知道我是否可以利用 spring 的可缓存注释和加载缓存?
基本上我想将业务层与缓存分开。
请帮忙。谢谢。
所以你想要黄油和果酱。好的。我将帮助您使用加载缓存并保持缓存逻辑独立。
假设您有一个服务 class SampleServiceImpl
实现了 SampleService
接口。
服务接口:
public interface SampleService {
User getUser(int id);
}
服务实施:
@Service
public class SampleServiceImpl implements SampleService {
public User getUser(int id) {
// fetch user from database
return user;
}
}
再创建一个 class SampleServiceCache
public class SampleServiceCache extends ServiceCacheImpl {
@Autowired
public SampleServiceCache(int expiryTime, int maximumSize) {
loadingCache =
CacheBuilder.newBuilder().maximumSize(maximumSize).expireAfterAccess(expiryTime, TimeUnit.HOURS).build(
new CacheLoader<Integer, User>() {
@Override
public User load(@Nonnull Integer userId) {
return SampleServiceCache.super.getUser(userId);
}
});
}
@Override
public User getUser(int userId) {
return loadingCache.getUnchecked(userId);
}
}
在你的 bean 配置中:
@Bean
public SampleService sampleService() {
return new SampleServiceCache(expiry, maxSize);
}
那天你想删除缓存,你必须做两件事:
1.删除缓存class.
2. 将bean config 更改为return 实际实现对象而不是缓存实现对象。
P.S。您可以为用户检索、文章检索等不同行为定义多个加载缓存。
番石榴缓存已弃用。如果你有现有代码,那是另一回事,但对于新代码,请使用 Caffeine.
在要为其缓存 return 值的方法上放置一个 @Cacheable("myCacheName")
。
如果使用 Spring 引导,请在您的应用程序 class 上放置一个 @EnableCaching
,否则在某些 @Configuration
class.
如果使用 Spring 引导,请在 application.properties
中设置规范,如下所示:spring.cache.caffeine.spec=maximumSize=10000,expireAfterWrite=5m
。如果不使用 Boot,请在与上面 #3 中相同的 class 上使用 @PropertySources
注释。
将 org.springframework.boot:spring-boot-starter-cache
和 com.github.ben-manes.caffeine:caffeine
添加到您的构建文件中。如果不使用 Boot,则需要以不同方式设置依赖项。
大功告成。
我正在使用 Google 番石榴缓存 + Spring 缓存抽象用于缓存目的。 我正在尝试使用 Guava 的 Loading Cache 接口。
我知道 Spring 提供对 Guava Cache 的支持,但我想知道我是否可以利用 spring 的可缓存注释和加载缓存?
基本上我想将业务层与缓存分开。
请帮忙。谢谢。
所以你想要黄油和果酱。好的。我将帮助您使用加载缓存并保持缓存逻辑独立。
假设您有一个服务 class SampleServiceImpl
实现了 SampleService
接口。
服务接口:
public interface SampleService {
User getUser(int id);
}
服务实施:
@Service
public class SampleServiceImpl implements SampleService {
public User getUser(int id) {
// fetch user from database
return user;
}
}
再创建一个 class SampleServiceCache
public class SampleServiceCache extends ServiceCacheImpl {
@Autowired
public SampleServiceCache(int expiryTime, int maximumSize) {
loadingCache =
CacheBuilder.newBuilder().maximumSize(maximumSize).expireAfterAccess(expiryTime, TimeUnit.HOURS).build(
new CacheLoader<Integer, User>() {
@Override
public User load(@Nonnull Integer userId) {
return SampleServiceCache.super.getUser(userId);
}
});
}
@Override
public User getUser(int userId) {
return loadingCache.getUnchecked(userId);
}
}
在你的 bean 配置中:
@Bean
public SampleService sampleService() {
return new SampleServiceCache(expiry, maxSize);
}
那天你想删除缓存,你必须做两件事:
1.删除缓存class.
2. 将bean config 更改为return 实际实现对象而不是缓存实现对象。
P.S。您可以为用户检索、文章检索等不同行为定义多个加载缓存。
番石榴缓存已弃用。如果你有现有代码,那是另一回事,但对于新代码,请使用 Caffeine.
在要为其缓存 return 值的方法上放置一个
@Cacheable("myCacheName")
。如果使用 Spring 引导,请在您的应用程序 class 上放置一个
@EnableCaching
,否则在某些@Configuration
class.如果使用 Spring 引导,请在
application.properties
中设置规范,如下所示:spring.cache.caffeine.spec=maximumSize=10000,expireAfterWrite=5m
。如果不使用 Boot,请在与上面 #3 中相同的 class 上使用@PropertySources
注释。将
org.springframework.boot:spring-boot-starter-cache
和com.github.ben-manes.caffeine:caffeine
添加到您的构建文件中。如果不使用 Boot,则需要以不同方式设置依赖项。
大功告成。