当屡次查询数据库影响到系统性能的时候,能够考虑使用缓存,来解决数据访问新能的问题。
SpringBoot 已经为咱们提供了自动配置多个 CacheManager 的实现,只要去实现使用它就能够了。css
通常的系统都是优先使用 EhCache,它工做在 JAVA 进程中,在传统的应用没有太大要求的时候,使用它比较方便,分布式系统中去使用 Shiro 集中管理缓存。html
在 pom.xml 中加入依赖java
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
新建 ehcache.xml
,加入缓存相关参数, 我新添加一个 name 为 users 的缓存设置:spring
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false">
<diskStore path="java.io.tmpdir/Tmp_EhCache"/>
<defaultCache maxElementsInMemory="1000" maxEntriesLocalHeap="400" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false" diskPersistent="false" diskExpiryThreadIntervalSeconds="120"/>
<cache name="users" maxEntriesLocalHeap="200" timeToLiveSeconds="600" />
</ehcache>
参数详解:数据库
ehcache.xml
做为 EhCache 的配置文件:spring:
cache:
ehcache:
config: config/ehcache.xml # 指定 ehcache.xml 建立EhCache的缓存管理器
type: ehcache # 指定缓存管理器
@EnableCaching
,开启缓存。使用的时候须要注意,咱们以前在 shiro 缓存中 配置了相关的缓存的配置,如今须要把 shiro 相关的缓存的内容所有都要删除掉,否则二者的缓存会存在冲突。
仍是以 shiro 的获取权限列表的服务为例,不用 shiro-cache 后,直接在查询的这里本身添加上缓存就能够了。数组
@CacheConfig(cacheNames = "users")
public interface ShiroService {
/** * 获取用户权限 * * @param userId 用户ID * @return 权限 */
@Cacheable
Set<String> getUserPermissions(long userId);
debug 调试,缓存
@Autowired
private CacheManager cacheManager;
发现 key 为 users
中存储了相关内容。springboot
@CacheConfig
:主要用于配置该类中会用到的一些共用的缓存配置。在这里@CacheConfig(cacheNames = "users")
:配置了该数据访问对象中返回的内容将存储于名为users的缓存对象中,咱们也能够不使用该注解,直接经过@Cacheable本身配置缓存集的名字来定义。getUserPermissions(long userId)
函数的返回值将被加入缓存。同时在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问。该注解主要有下面几个参数: value
、cacheNames
:两个等同的参数(cacheNames为Spring 4新增,做为value的别名),用于指定缓存存储的集合名。因为Spring 4中新增了@CacheConfig,所以在Spring 3中本来必须有的value属性,也成为非必需项了。key
:缓存对象存储在Map
集合中的key
值,非必需,缺省按照函数的全部参数组合做为key值,若本身配置需使用SpEL
表达式,好比:@Cacheable(key = "#p0")
:使用函数第一个参数做为缓存的key值,更多关于SpEL表达式的详细内容可参考官方文档condition
:缓存对象的条件,非必需,也需使用SpEL表达式,只有知足表达式条件的内容才会被缓存,好比:@Cacheable(key = "#p0", condition = "#p0.length() < 3")
,表示只有当第一个参数的长度小于3的时候才会被缓存,unless
:另一个缓存条件参数,非必需,需使用SpEL表达式。它不一样于condition
参数的地方在于它的判断时机,该条件是在函数被调用以后才作判断的,因此它能够经过对result
进行判断。keyGenerator
:用于指定key
生成器,非必需。若须要指定一个自定义的key生成器,咱们须要去实现org.springframework.cache.interceptor.KeyGenerator
接口,并使用该参数来指定。须要注意的是:该参数与key是互斥的。cacheManager
:用于指定使用哪一个缓存管理器,非必需。只有当有多个时才须要使用。cacheResolver
:用于指定使用那个缓存解析器,非必需。需经过org.springframework.cache.interceptor.CacheResolver
接口来实现本身的缓存解析器,并用该参数指定。除了这里用到的两个注解以外,还有下面几个核心注解:
* @CachePut
:配置于函数上,可以根据参数定义条件来进行缓存,它与@Cacheable
不一样的是,它每次都会真是调用函数,因此主要用于数据新增和修改操做上。它的参数与@Cacheable
相似,具体功能可参考上面对@Cacheable参数的解析
* @CacheEvict
:配置于函数上,一般用在删除方法上,用来从缓存中移除相应数据。除了同@Cacheable
同样的参数以外,它还有下面两个参数:
1. allEntries
:非必需,默认为false
。当为true
时,会移除全部数据
2. beforeInvocation
:非必需,默认为false
,会在调用方法以后移除数据。当为true
时,会在调用方法以前移除数据。markdown
在Spring Boot中经过@EnableCaching注解自动化配置合适的缓存管理器(CacheManager),Spring Boot根据下面的顺序去侦测缓存提供者:
1. Generic
2. JCache (JSR-107)
3. EhCache 2.x
4. Hazelcast
5. Infinispan
6. Redis
7. Guava
8. Simpleless
一般仍是推荐去指定一个 缓存类型比较好,在系统配置文件配置:
spring:
cache:
type: ehcache