Spring Boot缓存技术

1、什么是缓存,为什么要用缓存?

缓存就是数据交换的缓冲区(称作Cache),是存贮数据(使用频繁的数据)的临时地方。当用户查询数据,首先在缓存中寻找,如果找到了则直接执行。如果找不到,则去数据库中查找。

缓存的本质就是用空间换时间,牺牲数据的实时性,以服务器内存中的数据暂时代替从数据库读取最新的数据,减少数据库IO,减轻服务器压力,减少网络延迟,加快页面打开速度。

2、Spring Boot中缓存

Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术;并支持使用JCache(JSR-107)注解简化我们开发;

1.Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;

2.Cache接口下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheche,
ConcurrenMapCacheManager(springboot的默认缓存管理器)等;

3.每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过;
如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。

4.使用Spring缓存抽象时我们需要关注以下两点:
	1.确定方法需要被缓存以及他们的缓存策略
	2.从缓存中读取之前缓存存储的数据

3、Spring Boot缓存重要注解

1.Spring提供的重要缓存注解

1.@Cacheable:针对方法配置,能够根据方法的请求参数对其结果进行缓存
@Cacheable注解会查询是否已经有缓存,有会使用缓存,没有则会执行方法并缓存方法的返回值。

2.@CacheEvict:清空缓存
@CacheEvict的作用主要针对方法配置,能够根据一定的条件对缓存进行清空。

3.@CachePut:既调用方法,又更新缓存数据
@CachePut注解的作用主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
,和@Cacheable不同的是,它每次都会触发真实方法的调用。简单来说就是用户更新缓存数据。
但需要注意的是该注解的value和key必须与要更新的缓存相同,也就是与@Cacheable相同。

4.@EnableCaching:开启基于注解的缓存
在spring boot启动类上开启缓存注解

5.@Caching:定义复杂的缓存规则
有时候可能组合多个Cache注解使用,此时就需要@Caching组合多个注解标签了。

6.@CacheConfig:统一配置本类的缓存注解的属性
当需要缓存的地方越来越多,可以使用@CacheConfig(cacheNames = {"myCache"})
注解来统一指定value的值,这时可省略value,如果方法依旧写上了value,那么依然以方法的value值为准。

2.@Cacheable/@CachePut/@CacheEvict主要的参数

1.value缓存的名称,在spring配置文件中定义,必须指定至少一个。
如:@CacheConfig(cacheNames = "PersonCache")
例如:@Cacheable(value="mycache")或者@Cacheable(value={"cache1","cache2"})
	
2.key缓存的key,可以为空,如果指定要按照SpEL表达式编写,如果不指定,
则缺省按照方法的所有参数进行组合。
例如:@Cacheable(value="testcache",key="#id")

3.condition缓存的条件,可以为空,使用SpEL编写,返回true或者false,只有为true才进行缓存/清除。
例如:@Cacheable(value="testcache",condition="#userName.length()>2")

4.unless否定缓存。当条件结果为TRUE时,就不会缓存。
@Cacheable(value"testcache",unless="#userName.length()>2")

5.allEntries(@CacheEvict)是否清空所有缓存内容,缺省为false,如果指定为true,
则方法调用后将立即清空所有缓存。
例如:@CacheEvict(value="testcache",allEntries=true)

6.beforeInvocation(@CacheEvict)是否在方法执行前就清空,缺省为false,如果指定为true,
则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存。
例如:@CacheEvict(value="testcache",beforeInvocation=true)

你可能感兴趣的:(缓存,spring,boot,java)