我正在使用 Google Guava Cache + Spring 缓存抽象来进行缓存。我正在尝试使用 Guava 的 Loading Cache 接口。
我知道 Spring 提供了对 Guava Cache 的支持,但我想知道是否可以使用 Spring 的可缓存注释以及 Loading Cache?
基本上我想将业务层与缓存分开。
请帮忙。谢谢。
我正在使用 Google Guava Cache + Spring 缓存抽象来进行缓存。我正在尝试使用 Guava 的 Loading Cache 接口。
我知道 Spring 提供了对 Guava Cache 的支持,但我想知道是否可以使用 Spring 的可缓存注释以及 Loading Cache?
基本上我想将业务层与缓存分开。
请帮忙。谢谢。
不推荐使用 Guava 缓存。如果您有现有代码,那将是另一回事,但对于新代码,请使用Caffeine。
将 a@Cacheable("myCacheName")
放在要为其缓存返回值的方法上。
@EnableCaching
如果使用 Spring Boot,则在您的应用程序类上放置一个,否则在某个@Configuration
类上。
application.properties
如果使用 Spring Boot,请设置规范,如下所示spring.cache.caffeine.spec=maximumSize=10000,expireAfterWrite=5m
:如果不使用 Boot,@PropertySources
请在与上述 #3 相同的类上使用注释。
org.springframework.boot:spring-boot-starter-cache
将和添加com.github.ben-manes.caffeine:caffeine
到您的构建文件中。如果不使用 Boot,则需要以不同方式设置依赖项。
你完成了。
所以你想要黄油和果酱。好的。我将帮助您使用加载缓存以及保持缓存逻辑分开。
考虑您有一个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;
}
}
再创建一个类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. 删除缓存类。
2. 更改 bean config 以返回实际的实现对象,而不是缓存实现对象。
PS 你可以为不同的行为定义多个加载缓存,比如用户检索、文章检索等。