我使用Google Guava Cache + Spring缓存抽象来缓存。 我尝试使用Guava的加载缓存接口。
我知道Spring提供了对Guava Cache的支持,但我想知道我是否可以使用spring的可缓存注释以及Loading Cache?
基本上我想将业务层与Cache分开。
请帮助。感谢。
答案 0 :(得分:1)
不推荐使用番石榴缓存。如果你有现有代码,那将是另一回事,但对于新代码,请使用Caffeine。
在要为其缓存返回值的方法上放置@Cacheable("myCacheName")
。
如果使用Spring Boot,则在您的应用程序类上放置@EnableCaching
,否则在某些@Configuration
类上放置。
如果使用Spring Boot,请在application.properties
中设置规范,如下所示:spring.cache.caffeine.spec=maximumSize=10000,expireAfterWrite=5m
。如果不使用Boot,请在与上面#3相同的类中使用@PropertySources
注释。
将org.springframework.boot:spring-boot-starter-cache
和com.github.ben-manes.caffeine:caffeine
添加到您的构建文件中。如果不使用Boot,则需要以不同方式设置依赖关系。
你已经完成了。
答案 1 :(得分:0)
所以你想要黄油和果酱。好的。我将帮助您使用加载缓存以及保持缓存逻辑分离。
假设您有一个服务类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配置以返回实际的实现对象,而不是缓存实现对象。
P.S。您可以为不同的行为定义多个加载缓存,例如用户检索,文章检索等。