一 JSR107(下面会有具体Springboot代码演示)
Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry。
-
1 CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider。
-
2 CacheManager定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。
-
3 Cache是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个CacheManager所拥有。
-
4 Entry是一个存储在Cache中的key-value对.
-
5 Expiry 每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。
如下图所示:
二 Spring缓存抽象(下面会有具体Springboot代码演示)
使用注解简化开发
-
1 Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;
-
2 Cache接口下Spring提供了各种xxxCache的实现,如RedisCache,EhCacheCache , ConcurrentMapCache等;每次调用需要缓存功能的方法时,Spring会检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果返回给用户。下次直接从缓存中获取。
-
3 使用Spring缓存抽象时我们需要关注以下两点: 第一点就是确定方法需要被缓存以及他们的缓存策略 ,第二点就是从缓存中读取之前缓存存储的数据.
三 缓存注解
其他
-
@Cacheables 能够根据方法的请求参数对其结果进行缓存;
cacheNames 缓存的名称,也就是在缓存中有一个叫emp的名字来标识不同的缓存组件。
@Cacheable(cacheNames = {"emp"})
public Employee getEmpById(Integer id){
System.out.println("查询" + id + "号员工");
Employee employee = emploeeMapper.getEmpById(id);
return employee;
}
- @CachePut 同步更新缓存
// @CachePut: 既调用方法,又更新缓存数据;同步更新缓存
// 修改了数据库的某个数据,同时更新缓存
// 运行:
// 1.先调用目标方法
// 2.将目标方法的结果缓存起来
@CachePut(key = "#result.id")
public Employee updateEmp(Employee employee){
System.out.println("updateEmp "+employee);
emploeeMapper.updateEmpById(employee);
return employee;
}
- @CacheEvict 缓存清除
// @CacheEvict:缓存清除
// key:指定要清除的数据
// allEntries = true : 指定清除这个缓存中的所有数据
// beforeInvocation=fales: 缓存的清除是否在方法之前执行
// 默认代表缓存清除操作是在方法执行之后执行;如果出现异常缓存就不会清除
// beforeInvocation=true 代表清除缓存操作是在方法运行之前执行,无论方法是否出现异常,缓存都清除
@CacheEvict(beforeInvocation = true)
public void deleteEmp(Integer id){
System.out.println("delteEmp: " + id);
int i = 101/0;
emploeeMapper.deleteEmpById(id);
}
这里有异常是因为有一句int i = 101/0 所以异常,但是不影响结果
SpringBoot缓存使用及原理地址 : blog.csdn.net/qq_38974634…