缓存架构设计&Spring对于Cache的抽象架构

目录

缓存架构设计

JSR107

JSR107核心接口

JSR107图示

Spring对于Cache的抽象架构

介绍

@Cacheable

@CachePut

@CacheEvict

@CacheConfig


  • 缓存架构设计

  • JSR107

  • 首先,来了解一下JSR107规范
  • JSR是Java Specification Requests 的缩写 ,Java规范请求,顾名思义即提交Java规范
  • JSR-107就是关于如何使用缓存的规范,是java提供的一个接口规范,类似于JDBC规范,没有具体的实现,具体的实现就是ehcache等这些缓存解决方案
  • JSR107核心接口

  • Java Caching(JSR-107)定义了5个核心接口,分别是CachingProvider、CacheManager、Cache、Entry和Expiry
    • CachingProvider(缓存提供者):创建、配置、获取、管理和控制多个CacheManager
    • CacheManager(缓存管理器):创建、配置、获取、管理和控制多个唯一命名的Cache,Cache存在于CacheManager的上下文中;一个CacheManager仅对应一个CachingProvider
    • Cache(缓存):是由CacheManager管理的,CacheManager管理Cache的生命周期,Cache存在于CacheManager的上下文中,是一个类似map的数据结构,并临时存储以key为索引的值;一个Cache仅被一个CacheManager所拥有
    • Entry(缓存键值对):是一个存储在Cache中的key-value对
    • Expiry(缓存时效):每一个存储在Cache中的条目都有一个定义的有效期;一旦超过这个时间,条目就自动过期,过期后,条目将不可以进行访问、更新和删除操作;缓存有效期可以通过ExpiryPolicy设置
  • JSR107图示

  • 一个应用里面可以有多个缓存提供者(CachingProvider),一个缓存提供者可以获取到多个缓存管理器(CacheManager)
  • 一个缓存管理器管理着不同的缓存(Cache),缓存中是一个个的缓存键值对(Entry),每个entry都有一个有效期(Expiry)
  • 缓存管理器和缓存之间的关系有点类似于数据库中连接池和连接的关系
  • 使用JSR-107需导入的依赖:

  • Spring对于Cache的抽象架构

  • 介绍

  • Spring提供的重要缓存注解及几个重要概念:

  • 使用方法就是在启动类上加上 @EnableCaching 注解来开启缓存功能
  • 之后就可以在方法上使用上述注解进行缓存的使用
  • 下面针对几个重要注解做一下讲解
  • @Cacheable

  • 将方法运行的结果进行缓存,以后再获取相同的数据时,直接从缓存中获取,不再调用方法
  • 使用示例如下:

  • @Cacheable 注解的属性:

  • 注意:
    • 既满足condition又满足unless条件的也不进行缓存
    • 使用异步模式进行缓存时(sync=true):unless条件将不被支持
  • 可用的SpEL表达式见下表:

  • @CachePut

  • 说明:既调用方法,又更新缓存数据,一般用于更新操作
  • 在更新缓存时一定要和想更新的缓存有相同的缓存名称和相同的key(可类比同一张表的同一条数据)
  • 示例如下:

  • @CacheEvict

  • 说明:缓存清除,清除缓存时要指明缓存的名字和key,相当于告诉数据库要删除哪个表中的哪条数据,key默认为参数的值
  • 注意:allEntries属性是指是否清除指定缓存中的所有键值对,默认为false,设置为true时会清除缓存中的所有键值对,与key属性二选一使用
  • beforeInvocation指在@CacheEvict注解的方法调用之前清除指定缓存,默认为false,即在方法调用之后清除缓存
  • 设置为true时则会在方法调用之前清除缓存(在方法调用之前还是之后清除缓存的区别在于方法调用时是否会出现异常,若不出现异常,这两种设置没有区别,若出现异常,设置为在方法调用之后清除缓存将不起作用,因为方法调用失败了)
  • 示例:

  • @CacheConfig

  • 作用:标注在类上,抽取缓存相关注解的公共配置,可抽取的公共配置有缓存名字、主键生成器等(如注解中的属性所示):

  • 示例:通过@CacheConfig的cacheNames 属性指定缓存的名字之后,该类中的其他缓存注解就不必再写value或者cacheName了,会使用该名字作为value或cacheName的值,当然也遵循就近原则:

猜你喜欢

转载自blog.csdn.net/weixin_59624686/article/details/130786009