Spring缓存

Spring 缓存

缓存概念

  • 将一次查询的查询结果存到内存中,下次再进行类似查询不再执行方法取得结果,而是直接从缓存读取。缓存通俗讲就是把一个数据临时存储到内存中,下次需要则直接读取,不必再去执行方法,提高响应速度。

spring cache介绍

  • Spring Cache 是Spring 提供的一整套的缓存解决方案,它不是具体的缓存实现,它只提供一整套的接口和代码规范、配置、注解等,用于整合各种缓存方案。
  • Spring Cache依赖Spring的天然优势——AOP,我们只需要显式地在代码中调用第三方接口,在方法上加上注解,就可以实现把获取到的结果后把结果插入缓存内,在下一次查询的时候优先从缓存中读取数据。

入门案例(使用Spring内置缓存)

  • 分为三步,分别为加依赖,开启缓存、加注解。
第一步:导依赖
        <!-- cache依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
第二步:开始缓存
  • 要使用spring缓存需要在启动类上加上@EnableCaching注解开启缓存
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
@MapperScan("com.xucanjie.dao")
public class SpringCacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCacheApplication.class, args);
    }

}
第三步:加上缓存注解
  • 在service层加上注解,在需要缓存返回结果的方法上加上注解@Cacheable即可,下面再进行各个注解详解
@Service
public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements BookService{

    @Autowired
    BookMapper bookMapper;
    @Override
    @Cacheable("bookList")
    public List<Book> caChe() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        List<Book> books = bookMapper.selectList(null);
        return books;
    }
}

效果展示
  • 定义一个controller去调用
    @Autowired
    BookService bookService;

    @GetMapping("/cache")
    List<Book> books(){
        System.out.println("----------请求开始----------------");
        System.out.println(LocalDateTime.now());
        List<Book> books = bookService.caChe();
        System.out.println(LocalDateTime.now());
        System.out.println("----------请求结束----------------");
        System.out.println();
        System.out.println();
        System.out.println();
        return books;
  • 两次请求对比
----------请求开始----------------
2022-07-14T17:35:26.238
2022-07-14T17:35:31.339
----------请求结束----------------



----------请求开始----------------
2022-07-14T17:35:36.222
2022-07-14T17:35:36.223
----------请求结束----------------
  • 案例中在service中是进行了一个休眠,第二次请求的请求很明显是进行了缓存的读取
  • 下面进行各个注解讲解

spring缓存注解

主要的有三个注解@Cacheable注解,

@Cacheable注解
  • @Cacheble注解表示这个方法的结果可以被缓存,调用该方法前,会先检查对应的缓存key在缓存中是否已经有值,如果有就直接返回,不调用方法,如果没有,就会调用方法,同时把结果缓存起来。
  • @Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。
  • @Cacheable可以指定三个属性,value、key和condition。
    在这里插入图片描述
  • value值可以是一个或者多个
  • key
    1. 如果没有参数,则使用0作为key
    2. 如果只有一个参数,使用该参数作为key
    3. 如果又多个参数,使用包含所有参数的hashCode作为key
  • condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。
//当只有满足价格小于32之间才会触发缓存
@Cacheable(cacheNames="book", condition="#price < 32""")
public Book findBook(double price)
@CachePut 注解
  • @CachePut注解修饰的方法,会把方法的返回值put到缓存里面缓存起来,它只是触发put的动作,和@Cacheable不同,不会读取缓存,put到缓存的值进程内其他场景的使用者就可以使用了。
  • 用法和@Cacheable类似,只是这个每次都会更新缓存
@CacheEvict 注解
  • @CacheEvict注解修饰的方法,会触发缓存的evict操作,清空缓存中指定key的值。
    在这里插入图片描述
  • @CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。
  1. allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。
@CacheEvict(cacheNames="books", allEntries=true)
public void loadBooks(InputStream batch)
  1. 清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素
@CacheEvict(cacheNames="books", beforeInvocation=true)
public void loadBooks(InputStream batch)
@Caching 注解
  • @Caching注解可以让我们在一个方法或者类上同时指定多个Spring Cache相关的注解。其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。
  @Caching(cacheable = @Cacheable(“users”), evict = { @CacheEvict(“cache2”),
         @CacheEvict(value = “cache3”, allEntries = true)} 
   }
@CacheConfig 注解
  • 只能作用在类上面,提取当前类共有的属性
  • 假设某个类的所有方法的缓存注解名字都叫book,就可以讲名字属性提取出来
@CacheConfig(cacheNames = "emp")
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring框架提供了多个缓存级别供开发者选择和配置。其中包括: 1. 类级别缓存:通过在类级别上使用`@CacheConfig`注解,可以为整个类的方法启用缓存。这意味着类中的所有方法都将使用相同的缓存配置。 2. 方法级别缓存:通过在方法上使用`@Cacheable`注解,可以为特定的方法启用缓存。这样,每次调用该方法时,Spring会首先检查缓存中是否存在相应的结果,如果存在,则直接返回缓存中的值,而不执行方法体。 3. 更新缓存:通过`@CachePut`注解,可以在方法执行后将结果存储到缓存中。这对于需要更新缓存的方法非常有用,例如在更新数据库记录后,同时更新缓存。 4. 清除缓存:通过`@CacheEvict`注解,可以清除指定的缓存。这对于需要在方法执行后清除缓存的情况非常有用,例如在删除数据库记录后,同时清除缓存。 需要注意的是,Spring框架本身并不提供具体的缓存实现,而是通过与各种缓存方案的整合来实现缓存功能。开发者可以根据自己的需求选择合适的缓存实现,如Caffeine、Guava Cache、Ehcache等。通过配置`CacheManager`组件,可以将这些缓存实现集成到Spring框架中。 综上所述,Spring框架提供了多个缓存级别,包括类级别缓存、方法级别缓存、更新缓存和清除缓存。开发者可以根据需要选择和配置适合的缓存实现。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [缓存-SpringCache](https://blog.csdn.net/weixin_68829137/article/details/127164634)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [最通俗的方法让你搞懂spring缓存机制](https://blog.csdn.net/qq_29235677/article/details/121685290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值