Spring Cache

使用步骤

1.导入坐标

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-cacheartifactId>
dependency>

2.开启基于注解的缓存,使用 @EnableCaching 标注在 springboot 主启动类上。
3.标注缓存注解 @Cacheable
  使用 @Cacheable 注解Spring会在其被调用后将其返回值缓存起来,以后查询相同的数据,直接从缓存中取,不需要调用方法。
  标记在类上:该类所有方法支持缓存。
  标记在方法上:该方法支持缓存。
当一个支持缓存的方法在对象内部被调用时不会触发缓存功能。

注解属性说明

@Cacheable

  • cacheNames/value :用来指定缓存组件的名字
  • key :缓存数据时使用的 key,可以用它来指定。默认是使用方法参数的值。(这个 key 你可以使用 spEL 表达式来自定义【使用方法参数时直接使用 '#参数名 ‘, ’ #p 参数index’ 】)
  • keyGenerator :key 的生成器。 key 和 keyGenerator 二选一使用
  • cacheManager :可以用来指定缓存管理器。从哪个缓存管理器里面获取缓存。
  • condition :可以用来指定符合条件的情况下才缓存
  • unless :否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。当然你也可以获取到结果进行判断。(通过 #result 获取方法结果)
  • sync :是否使用异步模式。

默认key生成策略

  • 如有方法没有参数,则使用 0 作为key。
  • 如果只有一个参数的话则使用该参数作为key。
  • 如果参数多于一个的话则使用所有参数的hashCode作为key。

@CachePut

@CachePut注解属性与@Cacheable注解属性相比少了sync属性。其他用法基本相同.

如果一个方法使用了@Cacheable注解,当重复(n>1)调用该方法时,由于缓存机制,并未再次执行方法体,其结果直接从缓存中找到并返回,即获取还的是第一次方法执行后放进缓存中的结果。但实际业务并不总是如此,有些情况下要求方法一定会被调用,例如数据库数据的更新,系统日志的记录,确保缓存对象属性的实时性等等。
@CachePut 注解就确保方法调用即执行,执行后更新缓存。

@CacheEvict

用来标注在需要清除缓存元素的方法或类上。

  • value :用来指定缓存组件的名字。
  • key :缓存数据时使用的 key,可以用它来指定。
  • condition :可以用来指定符合条件的情况下才清除缓存。
  • allEntries:boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。
  • beforeInvocation:清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。

@Caching

@Caching是一个组注解,可以为一个方法定义提供基于@Cacheable、@CacheEvict或者@CachePut注解的数组。

  • cacheable:取值为基于@Cacheable注解的数组,定义对方法返回结果进行缓存的多个缓存。
  • put:取值为基于@CachePut注解的数组,定义执行方法后,对返回方的方法结果进行更新的多个缓存。
  • evict:取值为基于@CacheEvict注解的数组。定义多个移除缓存。

@CacheConfig

前面我们所介绍的注解都是基于方法的,如果在同一个类中需要缓存的方法注解属性都相似,则需要重复增加。Spring 4.0之后增加了@CacheConfig类级别的注解来解决这个问题。

  • cacheNames/value:指定类级别缓存的名字,缓存使用CacheManager管理多个缓存Cache,这些Cache就是根据该属性进行区分。对缓存的真正增删改查操作在Cache中定义,每个缓存Cache都有自己唯一的名字。
  • keyGenerator:类级别缓存的生成策略(键生成器)和key二选一,作用是生成键值key,keyGenerator可自定义。
  • cacheManager:指定类级别缓存管理器(例如ConcurrentHashMap、Redis等)。
  • cacheResolver:和cacheManager作用一样,使用时二选一。
package com.example.cache.springcache;

import com.example.cache.springcache.entity.User;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;

/**
在@CacheConfig注解中定义了类级别的缓存users和自定义键生成器,
那么在findA0和findB(方法中不再需要重复指定,而是默认使用类级别的定义。
**/
@CacheConfig(cacheNames = "users",keyGenerator = "myKeyGenerator")
public class UserService4 {
    @Cacheable
    public User findA(User user){
        //todo:执行一些操作
    }
        
    @CachePut
    public User findB(User user){
        //todo:执行一些操作
    }
}

你可能感兴趣的:(#,SpringBoot,spring,java,spring,boot)