这一章 考点不多
什么是缓存?为什么要设计出缓存?
企业级应用为了避免读取数据时受限于数据库的访问效率而导致整体系统性能偏低,通
 常会在应用程序与数据库之间建立一种临时的数据存储机制,该临时存储数据的区域称
 为缓存。缓存是一种介于数据永久存储介质与应用程序之间的数据临时存储介质,可以
 提供临时的数据存储空间,合理使用缓存可以有效减少低速数据读取(例如磁盘 IO )过
 程的次数,以提高系统性能
Spring默认缓存
申明式注解
@EnableCaching 注解
@EnableCaching 是 Spring 框架提供的用于 开启基于注解的缓存支持的注解 ,当配置类上使用
 @EnableCaching 注解,会默认提供 CacheManager 的实现,并通过 AOP 将缓存行为添加到应用程序。执行操作时,会检查是否已经存在注解对应的缓存。如果找到了,就会自动创建一个代理拦截方法调用,使用缓存的 Bean 执行处理。 
@Cacheable 注解
@Cacheable 注解用于标注可缓存的方法,通常标注的方法为数据查询方法。标注 @Cacheable 注解的方法在执行时,会先查询缓存,如果查询到的缓存为空,则执行该方法,并将方法的执行结果添加到缓存;如果查询到缓存数据,则不执行该方法,而是直接使用缓存数据
注解属性
属性名 说明
value/cacheNames 指定缓存的名称,必备属性,这两个属性二选一使用
key 指定缓存数据的 key ,默认使用方法参数值,可以使用 SpEL 表达式
keyGenerator 指定缓存数据的 key 的生成器,与 key 属性二选一使用
cacheManager 指定缓存管理器
cacheResolver 指定缓存解析器,与 cacheManager 属性二选一使用
condition 指定在符合某条件下进行数据缓存
unless 指定在符合某条件下不进行数据缓存
sync 指定是否使用异步缓存,默认为 false
value 和 cacheNames 属性作用相同,用于指定缓存的名称,二选一即可
@Cacheable("book")
public Book findById(Integer id){
return bookDao.findById(id).get();
}
@Cacheable 注解中可以指定多个缓存的名称,以便使用多个缓存。
@Cacheable({"book","hotBook"})
public Book findById(Integer id){
return bookDao.findById(id).get();
}
 condition 属性
 condition 属性用于对数据进行有条件的选择性存储,只有当指定条件为 true 时才会对查询结果进行缓存,可以使用 SpEL 表达式指定属性值
@Cacheable(cacheNames="book", condition="#id > 1")
public Book findBook(Integer id){
return bookDao.findById(id).get();
}
 unless 属性
 unless 属性的作用与 condition 属性相反,当指定的条件为 true 时,方法的返回值不会被缓存,也可以使用 SpEL 表达式指定
@Cacheable(cacheNames="book", unless = "#result==null")
public Book findBook(Integer id){
return bookDao.findById(id).get();
}
 sync 属性
 在多线程程序中,某些操作可能会同时引用相同的参数,导致相同的对象被计算好几次,从而达不到缓存的目的。对于这种情况,可以使用 sync 属性, sync 属性表示数据缓存过程中是否使用同步模式,默认值为 false ,通常不会使用该属性
@CachePut 注解
@CachePut 注 解 的 作 用 是 更 新 缓 存 数 据 , 当 需 要 更 新 缓 存 且 不 影 响 方 法 执 行 时 , 可 以 使 用@CachePut 注解,通常用在数据更新方法上。 @CachePut 注解的执行顺序是,先进行方法调用,然后将方法结果更新到缓存中
两者的区别
@CachePut注解会强制执行方法并进行缓存更新,使用 @Cacheable 注解时,如果请求能够在缓存中获取到对应的数据,就不会执行当前被 @Cacheable 注解标注的方法
@CacheEvict 注解
@CacheEvict 注解的作用删除缓存中的数据,通常标注在数据删除方法上。 @CacheEvict 注解的默认执行顺序是先进行方法调用,然后将缓存清除
该注解有两个属性
allEntries 属性
 allEntries 属性表示是否清除指定缓存空间中的所有缓存数据,默认值为 false ,即默认只删除指定 key对应的缓存数据
allEntries 属性
allEntries 属性表示是否清除指定缓存空间中的所有缓存数据,默认值为 false ,即默认只删除指定 key
对应的缓存数据。
@CacheEvict(cacheNames = "book",allEntries = true)
public void delById(Integer id){
bookDao.deleteById(id);
}
 beforeInvocation 属性
 beforeInvocation 属性表示是否在方法执行之前进行缓存清除,默认值为 false ,即默认在执行方法后再进行缓存清除。
@CacheEvict(cacheNames = "book",beforeInvocation = true)
public void delById(Integer id){
bookDao.deleteById(id);
}
@Caching 注解
什么时候用?
如果不同缓存之间的条件或者键表达式不同,就需要指定相同类型的多个注解,例如需要同时指定多个@CacheEvict 或 @CachePut ,这个时候可以使用 @Caching 注解。 @Caching 注解用于针对复杂规 则 的 数 据 缓 存 管 理
@Caching 注 解 中 允 许 使 用 多 个 嵌 套的 @Cacheable 、 @CachePut 或 @CacheEvict 。 在 @Caching 注 解 内 部 包 含 有Cacheable 、 put 和 evict 三个属性,分别对应于 @Cacheable 、 @CachePut 和 @CacheEvict 三个注解
@CacheConfig
@CacheConfig 注解使用在类上,主要用于统筹管理类中所有使用 @Cacheable 、 @CachePut 和@CacheEvict 注解标注方法中的公共属性
@CacheConfig(cacheNames = "book")
@Service
public class BookService {
@Autowired
private BookRepository bookRepository;
@Cacheable
public Book findById(Integer id){
return bookRepository.findById(id).get();
}
}
 
Spring整合Redis
 
第6章题目
一、填空题
 1.Spring Boot项目中开启缓存管理后,如果没有任何缓存组件,默认使用 Simple   缓存组件进行管理。 
 2.当配置类上使用 @EnableCaching    注解,会默认提供CacheManager的实现,并通过AOP将缓存行为添加到应用程序。 
 3.   @Cacheconfig  注解主要用于统筹管理类中所有声明式缓存注解的公共属性。 
 4.@Cacheable注解的  value   属性和cacheNames属性都可以指定缓存的名称。 
 5. Spring Boot项目中,全局配置文件中spring.cache.redis.key-prefix用于指定Redis中缓存key的    前缀 。
二、判断题
 1. CacheManager是缓存管理器,基于缓存名称对缓存进行管理。(对 )
 2.标注@Cacheable注解的方法执行时,会先进行查询缓存,如果查询到缓存数据,则不执行该方法。 (对 )
 3.@Cacheable注解的value和cacheNames属性作用相同,且要二选一使用。 (对 )
 4.Ehcache配置文件中,只有eternal为false时timeToLiveSeconds的设置才有效。 ( 对)
 5.Ehcache要将缓存持久化到本地磁盘,则操作的实体类需要实现序列化接口。 (对 )
三、选择题
 1.下列选项中,关于Spring Boot默认缓存方案说法错误的是(D)。 
 A.Spring Boot继承了Spring框架的缓存管理功能。
 B.Spring的缓存机制将提供的缓存作用于Java方法上。
 C.Spring的默认的缓存方案通过Cache和CacheManager接口统一不同的缓存技术。
 D.Spring中的Cache接口制定了管理Cache的规则。
解析:
CacheManager接口负责制定管理缓存(如创建、获取、删除Cache实例)的规则,而 **Cache接口 ** 仅定义了操作缓存数据的方法(如get()、put()、evict()等)
 2.下列选项中,对于@Cacheable注解的属性说明错误的是(A)。 
 A.value用于指定CacheManager的实现。
 B.key用于指定缓存数据的key。
 C.keyGenerator用于指定缓存数据的key的生成器。
 D.cacheManager用于指定缓存管理器。
解析:
用于指定缓存的名称
 3.下列选项中,对于声明式缓存注解的描述错误的是(B)。 
 A.@EnableCaching是Spring框架提供的用于开启基于注解的缓存支持的注解。
 B.@CachePut注解的执行顺序是,先将方法结果更新到缓存中,再进行方法调用。
 C.@CachePut注解的作用是更新缓存数据。
 D.@CacheEvict注解的默认执行顺序是,先进行方法调用,然后将缓存进行清除。
 4.下列选项中,对于类上标注@CacheConfig(cacheNames = "book")的描述正确的是(C)。 
 A.声明当前类中共享的属性cacheNames的值为book。
 B.类中所有方法上使用缓存注解时cacheNames属性的值默认都为book。
 C.如果类的方法上再次定义cacheNames属性,那么cacheNames属性的值最终为方法上指定的属性值。
 D.类的方法上可以再次定义cacheNames属性的值。
 5.下列选项中,Ehcache配置文件中用于指定是否启用磁盘持久化的属性是(D)。 
 A.external
 B.diskPersistent
 C.maxElementsInMemory
 D.memoryStoreEvictionPolicy
解析:
读英语即可,memoryStoreEvictionPolicy,内存+储存+政策=是否启用磁盘持久化