SpringBoot的缓存使用

一 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设置。

如下图所示:

SpringBoot的缓存使用_第1张图片

 

 

二 Spring缓存抽象(下面会有具体Springboot代码演示)

使用注解简化开发

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

  • 2 Cache接口下Spring提供了各种xxxCache的实现,如RedisCache,EhCacheCache , ConcurrentMapCache等;每次调用需要缓存功能的方法时,Spring会检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果返回给用户。下次直接从缓存中获取。

  • 3 使用Spring缓存抽象时我们需要关注以下两点: 第一点就是确定方法需要被缓存以及他们的缓存策略 ,第二点就是从缓存中读取之前缓存存储的数据.

三 缓存注解

 

SpringBoot的缓存使用_第2张图片

 

 

 

SpringBoot的缓存使用_第3张图片

 

 

 

SpringBoot的缓存使用_第4张图片

 

 

其他

  • @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 所以异常,但是不影响结果


作者:liuliangzhuo
链接:https://juejin.im/post/6858528097172619271
 

你可能感兴趣的:(数据库,java,python,spring,redis)