Spring Boot中的缓存
本文介绍了spring boot 1.3.0版本带来的缓存支持。spring boot是支持缓存的,但是直到1.3.0版本之前,是不能自动配置的。现在你就可以非常简单的在spring boot应用中使用缓存了:
缓存的自动配置
spring boot actuator增加了缓存的监控
在本文中,作者主要围绕上面两点来展开。本节使用的例子来自 spring data 教程,在这之上,增加了缓存实现(ehcache).你可以到以上链接的最末端下载样例代码。本文只介绍缓存部分。
缓存自动配置
在spring boot中,缓存的自动配置分三步
1.在SPRING BOOT的CONFIGURATION类上添加@EnableCaching注解
2.在类路径上添加缓存实现的库
3.在根类路径上,为CHCHE PROVIDER提供配置类
SPRING BOOT通过auto-configuration来简化了缓存的配置。
如果你不了解auto-configuration,这里给出一个粗略的定义:spring boot的auto-configuration会在应用启动时会在类路径和依赖的beans中查找库和配置文件。比如:在类路径上你有ehcache.xml文件,并有ehcache2.x库,spring boot就会你的应用自动配置ehcache作为缓存实现并进行cache manager的初始化。
在auto-configuration之前,你可能需要在spring boot的配置文件中这样配置:
@SpringBootApplication
@EnableCaching
public class MyBooks {
@Bean
public CacheManager cacheManager() { ...}
...
}
在spring boot 1.3.0中,这种配置就取消了,spring自动处理(spring有猜测的能力)。像下面这样:
1.在SPRING BOOT的CONFIGURATION类上添加@EnableCaching注解。这个注解表示在应用中启动缓存机制
2.在类路径上添加缓存实现库。如果你使用ehcache作为缓存实现,那就在POM文件中添加依赖即可
3.为cache provider添加配置文件。如果你使用ehcache,那么就添加chcache.xml到根类路径。
boot会按照下面的顺序来查找cache provider:
1 Generic
2 EhCache 2.x
3 Hazelcast
4 Infinispan
5 JCache
6 Redis
7 Guava
8 Simple
如果spring boot找到多个cache provider,那就必须在application.properties中指定:
# Only necessary if more than one provider is present
spring.cache.ehcache.provider=net.sf.ehcache.CacheManager
spring.cache.ehcache.config=classpath:config/another-config.xml
Spring Boot Actuator 缓存监控
metrics endpoint提供了很多应用运行期的变量。spring boot 1.3.0增加了cache的相关变量。提供的细节包括
cache的大小(cache.xxx.size)
命中率 (cache.xxx.hit.ratio)
失误率 (cache.xxx.miss.ratio)
注意:对于不同的cache provider,metrics提供的变量会有差异。你需要仔细阅读provider的文档,来帮助metrics的工作。我尝试多次,始终无法得到ehcache的hit/miss ratio。你只能看到cache的size数据。
例子
现在让我们使用例子来看如何配置缓存和使用metrics。例子是spring data tutorial提供的。
//相比较原来的代码,只是添加了@EnableCaching注解
@Configuration
@SpringBootApplication
@EnableJpaRepositories
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
现在要使一个方法变得可缓存。相同的方式也可以应用于别的方法。如果你要详细的了解spring的缓存,请参考spring cache tutorial.
@Cacheable ("books")
public Book findOne(long id);
最后在类根路径上加上ehcache.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<diskStore path="java.io.tmpdir" />
<defaultCache maxElementsInMemory="10" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />
<cache name="books" maxElementsInMemory="50" eternal="false" overflowToDisk="true" timeToIdleSeconds="0" timeToLiveSeconds="86400" />
</ehcache>
当spring boot启动时,会有对应的输出,表示spring在初始化ehcache