在SpringBoot的这篇文章中,我们将研究如何将SpringBoot与缓存集成。我们将检查springboot自动配置特性,它能够透明地挂接缓存。
Caffeine缓存
Caffeine是一个基于java8的高性能缓存库,提供接近最佳的命中率。它提供了一个非常类似于google guavaapi的内存缓存。如果caffinecachemanager
在类路径中找到Caffeine,Spring引导缓存启动器会自动配置caffinecachemanager
。Spring框架支持透明地向应用程序添加缓存。让我们看看如何将SpringBoot与缓存集成。
Maven依赖项
为了支持SpringBoot,我们需要在SpringBoot应用程序中添加以下两个依赖项。
- Spring Boot caching stater.
- Caffeine cache provider.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.7.0</version>
</dependency>
有关最新版本,请访问Caffeine网站。
服务设置
让我们创建一个简单的客户服务,它将从底层系统返回客户信息。我们将使用caffinecache在这个层上添加Spring框架缓存抽象。让我们看看我们的服务类:
public interface CustomerService {
Customer getCustomer(final Long customerID);
}
// Implementation
@Service
@CacheConfig(cacheNames = {"customer"})
public class DefaultCustomerService implements CustomerService {
private static final Logger LOG = LoggerFactory.getLogger(DefaultCustomerService.class);
@Cacheable
@Override
public Customer getCustomer(Long customerID) {
LOG.info("Trying to get customer information for id {} ",customerID);
return getCustomerData(customerID);
}
private Customer getCustomerData(final Long id){
Customer customer = new Customer(id, "testemail@test.com", "Test Customer");
return customer;
}
}
有几个重要的要点要讨论:
@CacheConfig
是类级注释,有助于简化缓存配置。- 用于标定可缓存方法的
@Cacheable
注释。简单地说,这个注释用于显示缓存API,我们希望将此方法的结果存储到缓存中,因此,在后续调用时,在缓存中返回的值不执行方法。
Spring缓存提供了一种非常透明的方式来启用缓存。我们在代码库中没有使用Caffeine cache的直接依赖,所有这些都是由Spring缓存框架内部处理的。
Caffeine Cache配置
SpringBoot提供了几个选项,可以在启动时配置Caffeine Cache缓存。我们可以通过配置文件配置这些属性(application.properties
或application.yml
)或以编程方式。让我们看看如何使用应用程序属性文件:
spring.cache.cache-names=ccustomer
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s
这个spring.cache.cache-names
创建客户缓存。Caffeine规范将缓存的最大大小定义为500,生存时间为10分钟。
Caffeine Java配置
我们还可以使用Java配置配置缓存。让我们看看Java配置是什么样子的:
@Configuration
public class CaffeineCacheConfig {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager("customer");
cacheManager.setCaffeine(caffeineCacheBuilder());
return cacheManager;
}
Caffeine < Object, Object > caffeineCacheBuilder() {
return Caffeine.newBuilder()
.initialCapacity(100)
.maximumSize(500)
.expireAfterAccess(10, TimeUnit.MINUTES)
.weakKeys()
.recordStats();
}
}
运行应用程序
让我们运行应用程序来查看它的实际运行情况:
@Component
public class CaffeineCacheApp implements CommandLineRunner {
private static final Logger LOG = LoggerFactory.getLogger(CaffeineCacheApp.class);
@Autowired
CustomerService customerService;
@Override
public void run(String...args) throws Exception {
LOG.info("Starting the Caffine cache testing process");
customerService.getCustomer(1 l); //No hit , since this is the first request.
customerService.getCustomer(2 l); //No hit , since this is the first request.
customerService.getCustomer(1 l); //hit , since it is already in the cache.
customerService.getCustomer(1 l); //hit , since it is already in the cache.
customerService.getCustomer(1 l); //hit , since it is already in the cache.
customerService.getCustomer(1 l); //hit , since it is already in the cache.
}
}
如果您查看上述程序的输出,它是这样的:
2019-05-15 20:09:50.865 INFO 86848 --- [ main] com.javadevjournal.CaffeineCacheApp : Starting the Caffeine cache testing process
2019-05-15 20:09:50.879 INFO 86848 --- [ main] c.j.service.impl.DefaultCustomerService : Trying to get customer information for id 1
2019-05-15 20:09:50.882 INFO 86848 --- [ main] c.j.service.impl.DefaultCustomerService : Trying to get customer information for id 2
一旦客户数据在缓存中,它就为缓存中的所有后续调用提供服务。看一下日志,虽然我们调用了getCustomer(1)
,但是日志语句只打印了一次,因为所有后续调用都是从缓存中得到服务的。
小结
在本文中,我们看到了如何将SpringBoot与缓存集成。我们选中了使用配置文件或通过Java配置来配置Caffeine的选项。本文的源代码可以在GitHub上找到:
https://github.com/umeshawasthi/javadevjournal/tree/master/Spring-Boot/spring-boot-caffeine-application
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1829.html
暂无评论