@EnableCaching,@Cacheable, @CachePut,@CacheEvict详解

这篇具有很好参考价值的文章主要介绍了@EnableCaching,@Cacheable, @CachePut,@CacheEvict详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Spring Boot中,可以通过@EnableCaching注解启用缓存功能,并结合Redis作为缓存实现。下面是一个使用@EnableCaching注解并结合Redis使用的示例:

  1. 添加Redis依赖,在pom.xml文件中添加以下依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. application.yml 配置Redis连接信息
spring:
  cache:
    type: redis
  redis:
    host: 127.0.0.1 # Redis服务器地址
    database: 1 # Redis数据库索引(默认为0)
    port: 6379 # Redis服务器连接端口
    password: # Redis服务器连接密码(默认为空)

指定缓存类型redis

1.@Cacheable

在启动类XXApplication.java主类中中加入注解@EnableCaching

@Cacheable可以标记在一个方法上,也可以标记在一个类上。

  • 当标记在一个方法上时表示该方法是支持缓存的
  • 当标记在一个类上时则表示该类所有的方法都是支持缓存的

对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略,这个稍后会进行说明。需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。

@Cacheable可以指定三个基本属性,value、key和condition。

1.1.1 value属性指定Cache名称

value属性是必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。其可以是一个Cache也可以是多个Cache,当需要指定多个Cache时其是一个数组。

	//Cache是发生在cache1上的
	@Cacheable("cache1")
  	public User find(Integer id) {
   	  return null;
   	}

	//Cache是发生在cache1和cache2上的
	@Cacheable({"cache1", "cache2"})
	public User find(Integer id) {
	   return null;
	} 

1.1.2 使用key属性自定义key

key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。我们这里先来看看自定义策略,至于默认策略会在后文单独介绍。

在@Cacheable注解中key的取值也可以使用SpringEL表达式来生成,内部可以嵌套方法的参数信息,例如,

@Cacheable(value = "fuck",key = "#id") 
    public List<String> getPrud(@RequestParam("test") String id){
        System.out.println("如果第二次没有走到这里说明缓存被添加了");
        List<String> list = new ArrayList<>();
        list.add(id);
        list.add("123");
        list.add("123");
        return list;
    }

此处的key值生成就是使用getPrud方法中的id参数生成的,即fuck:: + 参数id,除了这种方法以外还可以使用keyGenerator策略来生成key,即实现KeyGenerator方法,

@Component("myKeyGenerator")
public class MyKeyGenerator implements KeyGenerator {
    @Override
    public Object generate(Object o, Method method, Object... objects) {
        return "";
    }

在此方法中生成的返回值就是最终拼凑起来的test::后面的东西,实现方法之后再需要使用生成策略的方法中使用,

@Cacheable(value = "fuck",keyGenerator = "myKeyGenerator")
    public List<String> getPrud(@RequestParam("test") String id){
        System.out.println("如果第二次没有走到这里说明缓存被添加了");
        List<String> list = new ArrayList<>();
        list.add(id);
        list.add("123");
        list.add("123");
        return list;
    }

此方法的Redis缓存key值会按照fuck:: + myKeyGenerator组件中声明的返回值来生成。

除了上述使用方法参数作为key之外,Spring还为我们提供了一个root对象可以用来生成key。通过该root对象我们可以获取到以下信息。

属性名称 描述 示例
methodName 当前方法名 #root.methodName
method 当前方法 #root.method.name
target 当前被调用的对象 #root.target
targetClass 当前被调用的对象的class #root.targetClass
args 当前方法参数组成的数组 #root.args[0]
caches 当前被调用的方法使用的Cache #root.caches[0].name

当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。如:

   @Cacheable(value={"users", "xxx"}, key="caches[1].name")
   public User find(User user) {
      return null;

   }

1.1.3 condition属性指定发生的条件

有的时候我们可能并不希望缓存一个方法所有的返回结果。通过condition属性可以实现这一功能。condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。如下示例表示只有当user的id为偶数时才会进行缓存。

   @Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
   public User find(User user) {
      System.out.println("find user by user " + user);

      return user;

   }

2.@CachePut

对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。

@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

@CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的。

	//每次都会执行方法,并将结果存入指定的缓存中
	@CachePut("users")
	public User find(Integer id) {
	   returnnull;
	}

3.@CacheEvict

@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。

**@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。**其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。

此注解的使用方法与@Cacheable基本一致,也有三个基本属性,value、key和condition。不同的是在此注解中筛选出来的key值将被清除掉,例如:

@CacheEvict(value = "fuck",key = "1")
    public String test1(){
        return "fuck";
    }

同时@CacheEvict也有自己的独有的属性操作,下面我们来介绍一下新出现的两个属性allEntriesbeforeInvocation

3.1 allEntries属性

​ allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。

   @CacheEvict(value="users", allEntries=true)
   public void delete(Integer id) {
      System.out.println("delete user by id: " + id);
   }

3.2 beforeInvocation属性

​ 清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。

   @CacheEvict(value="users", beforeInvocation=true)
   public void delete(Integer id) {
      System.out.println("delete user by id: " + id);
   }

4.Caching

@Caching注解可以让我们在一个方法或者类上同时指定多个Spring Cache相关的注解。其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。

  @Caching(cacheable = @Cacheable("users"), evict = { @CacheEvict("cache2"),
  @CacheEvict(value = "cache3", allEntries = true) })
    public User find(Integer id) {
      return null;
    }

5.使用自定义注解

​ Spring允许我们在配置可缓存的方法时使用自定义的注解,前提是自定义的注解上必须使用对应的注解进行标注。如我们有如下这么一个使用@Cacheable进行标注的自定义注解。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Cacheable(value="users")
public @interface MyCacheable {

}

那么在我们需要缓存的方法上使用@MyCacheable进行标注也可以达到同样的效果。文章来源地址https://www.toymoban.com/news/detail-507481.html

   @MyCacheable
   public User findById(Integer id) {
      System.out.println("find user by id: " + id);
      User user = new User();
      user.setId(id);
      user.setName("Name" + id);
      return user;
   }

到了这里,关于@EnableCaching,@Cacheable, @CachePut,@CacheEvict详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring cache 学习 —— @Cacheable 使用详解

    @Cacheable 注解在方法上,表示该方法的返回结果是可以缓存的。也就是说,该方法的返回结果会放在缓存中,以便于以后使用相同的参数调用该方法时,会返回缓存中的值,而不会实际执行该方法。 注意,这里强调了一点:参数相同。 这一点应该是很容易理解的,因为缓存不

    2024年02月03日
    浏览(42)
  • spring boot 配置cacheManager EnableCaching EnableCaching

    jackson 方式 配置 cacheManager 

    2024年02月16日
    浏览(43)
  • Spring Boot 中的 @CacheEvict 注解

    在 Spring Boot 中,缓存是提高应用性能的重要手段。为了更好地管理缓存,Spring Boot 提供了一系列的缓存注解,其中 @CacheEvict 注解用于清空缓存。 本文将介绍 @CacheEvict 注解的含义、原理以及如何使用。 @CacheEvict 注解用于清空缓存。它可以标注在方法上,表示在执行该方法后

    2024年02月09日
    浏览(54)
  • @Cacheable 注解(指定缓存位置)

    1、缓存使用步骤:@Cacheable这个注解,用它就是为了使用缓存的。所以我们可以先说一下缓存的使用步骤: 1、开启基于注解的缓存,使用 @EnableCaching 标识在 SpringBoot 的主启动类上。 2、标注缓存注解即可  使用  @Cacheable  注解就可以将运行结果缓存,以后查询相同的数据,

    2024年02月07日
    浏览(52)
  • redis缓存神器:@Cacheable注解

    在之前的文章中,我们写了redis结合springboot做缓存分页的方法: 在 Spring Boot 中结合 Redis 进行缓存分页数据,可以通过以下步骤实现: 在 pom.xml 文件中添加 Redis 相关依赖: 在 application.properties 文件中配置 Redis 连接信息: 创建一个 RedisTemplate 对象,用于操作 Redis 缓存: 在

    2024年02月06日
    浏览(50)
  • SpringBoot的Cacheable缓存注解

    当我们的应用程序需要频繁地读取和写入数据时,为了提高应用程序的性能,我们通常会使用缓存技术。Spring Boot 提供了一种简单而强大的缓存框架,它可以轻松地将数据缓存到 Redis 中。 在 Spring Boot 中可以在方法上简单的加上注解实现缓存。 首先,您需要在您的项目中添加

    2024年02月10日
    浏览(44)
  • Spring Boot 中的 @Cacheable 注解

    在 Spring Boot 中,缓存是一个非常重要的话题。当我们需要频繁读取一些数据时,为了提高性能,可以将这些数据缓存起来,避免每次都从数据库中读取。为了实现缓存,Spring Boot 提供了一些缓存注解,其中最常用的是 @Cacheable 注解。 @Cacheable 注解用于标记一个方法需要被缓存

    2024年02月12日
    浏览(62)
  • SpringBoot 缓存之 @Cacheable 详细介绍

    1、缓存介绍 Spring 从 3.1 开始就引入了对 Cache 的支持。定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术。并支持使用 JCache(JSR-107)注解简化我们的开发。 其使用方法和原理都类似于 Spring 对事务管理的支持。Spring Cache 是作用在方

    2024年04月27日
    浏览(35)
  • SpringBoot通过@Cacheable注解实现缓存功能

    Spring 从 3.1 开始就引入了对 Cache 的支持。定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术。并支持使用 JCache(JSR-107) 注解简化我们的开发。 其使用方法和原理都类似于 Spring 对事务管理的支持,Spring Cache 是作用在方法上的,其核

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包