当前位置: 首页 > article >正文

Spring Cache

使用步骤

1.导入坐标

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</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:执行一些操作
    }
}

http://www.kler.cn/news/11715.html

相关文章:

  • 优化Key顺序提升ClickHouse查询性能
  • 使用kubeadm方式搭建K8S集群
  • mulesoft MCIA破釜沉舟备考 2023.04.17.13
  • 网络基本概念
  • 华为 ADS 2.0 发布,城区智驾之战「白热化」
  • C++ std::cin
  • 无限制翻译软件-中英互译字数无限
  • 2023软件测试最难求职季,哪些测试技能更容易拿到offer?
  • 第十四届蓝桥杯C++省赛B组 补题(3 - 10)
  • 网络安全之从原理看懂 XSS
  • 4月想跳槽的同学,没有更好的选择,可以去美团
  • pmp证书报考流程+pmp备考+pmp学习干货+pmp指南汇总
  • Socket套接字编程(实现TCP和UDP的通信)
  • 随想录Day55--动态规划: 392.判断子序列 , 115.不同的子序列
  • HTTP协议详解(一)
  • C ++匿名函数:揭开C++ Lambda表达式的神秘面纱
  • CloudCompare如何使用基础功能?
  • Java这么卷,还有前景吗?
  • 接口面试题
  • LeetCode 1041. 困于环中的机器人
  • namedtuple 命名元祖
  • 让PyTorch训练速度更快,你需要掌握这17种方法
  • 倍增?最近公共祖先?——从定义到实现,帮你一步步吃掉它!
  • Python零基础教程
  • IO-IO基础
  • day7 线程的取消和清理
  • Python基础-08 函数基础
  • Python-代码阅读(1)-funcs.py
  • 00.如何学习spring
  • Dapper——分布式跟踪系统