SpringBoot 缓存

简介

缓存主要是为了提高数据的读取速度。 因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能。

添加依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

开启缓存

在应用启动类中添加@EnableCaching注解,由此来开启缓存,如下所示:

@SpringBootApplication
@EnableCaching
public class CacheApplication {

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

}

添加缓存@Cacheable

@Cacheable注解会先查询是否已经有缓存,有会使用缓存,没有则会执行方法并将结果进行缓存。案例如下:

@Cacheable(value = "student", key = "#id")  // 设置缓存
public Student getById(Long id) {
    Student student = studentMapper.selectById(id);
    return student;
}

@Cacheable解析

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {

    // 为缓存进行命名,类似于命名空间,与value二选一
    @AliasFor("cacheNames")
    String[] value() default {};

    // 为缓存进行命名,类似于命名空间,与cacheNames二选一
    @AliasFor("value")
    String[] cacheNames() default {};

    // key的生成器,为缓存指定一个主键,后续可根据主键进行操作,可以为空,如果指定要按照 		// SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合
    String key() default "";

		// key的生成器,为缓存指定一个主键,后续可根据主键进行操作
    String keyGenerator() default "";

    // 指定缓存管理器
    String cacheManager() default "";
    
    // 指定缓存获取解析器
    String cacheResolver() default "";

    // 条件判定,如果条件为真则进行缓存
    String condition() default "";
    
    // 条件判定,条件符合则不缓存
    String unless() default "";
    
    // 是否使用异步模式
    boolean sync() default false;
}

缓存更新@CachePut

@CachePut注解的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用 。简单来说就是用户更新缓存数据。但需要注意的是该注解的valuekey 必须与要更新的缓存相同,也就是与@Cacheable 相同。

@CachePut(value = "student", key = "#student.id")  // 更新缓存
public Student updateStudent(Student student) {
   studentMapper.updateById(student);
   return student;
}

@CachePut解析

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CachePut {
  
    // 为缓存进行命名,类似于命名空间,与value二选一
    @AliasFor("cacheNames")
    String[] value() default {};

    // 为缓存进行命名,类似于命名空间,与cacheNames二选一
    @AliasFor("value")
    String[] cacheNames() default {};

    // key的生成器,为缓存指定一个主键,后续可根据主键进行操作,可以为空,如果指定要按照    SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合
    String key() default "";

    // key的生成器,为缓存指定一个主键,后续可根据主键进行操作
    String keyGenerator() default "";

   // 指定缓存管理器
    String cacheManager() default "";
    
    // 指定缓存获取解析器
    String cacheResolver() default "";
  
    // 条件判定,如果条件为真则进行缓存
    String condition() default "";

    // 条件判定,条件符合则不缓存
    String unless() default "";
}

缓存清除@CacheEvict

@CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空 。

// 清除一条缓存,key为要清空的数据
@CacheEvict(value = "student", key = "#id")
public void delStudent(Long id){
  System.out.println("进行缓存清除操作");
}

//方法调用前清空所有缓存
@CacheEvict(value = "student", beforeInvocation = true)
public void delBefore() {
  System.out.println("方法调用前清空所有缓存");
}

//方法调用后清空所有缓存
@CacheEvict(value = "student", allEntries = true)
public void delAfter() {
  System.out.println("方法调用后清空所有缓存");
}

@CacheEvict解析

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CacheEvict {
  
    // 为缓存进行命名,类似于命名空间,与cacheNames二选一
    @AliasFor("cacheNames")
    String[] value() default {};
  
    // 为缓存进行命名,类似于命名空间,与value二选一
    @AliasFor("value")
    String[] cacheNames() default {};

  	// key的生成器,为缓存指定一个主键,后续可根据主键进行操作,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合
    String key() default "";

    // key的生成器,为缓存指定一个主键,后续可根据主键进行操作
    String keyGenerator() default "";

    // 指定缓存管理器
    String cacheManager() default "";

    // 指定缓存获取解析器
    String cacheResolver() default "";
  
    // 条件判定,如果条件为真则进行缓存
    String condition() default "";

    // 是否清空所有缓存,默认为false,如果指定为true,则在方法调用后将立即清空所有缓存
    boolean allEntries() default false;
    
    // 是否在方法执行前就清空,默认为false,如果指定为true
    boolean beforeInvocation() default false;
}

@CacheConfig 配置

当我们需要缓存的地方越来越多,你可以使用@CacheConfig(cacheNames = {"myCache"})注解来统一指定value的值,这时可省略value,如果你在你的方法依旧写上了value,那么依然以方法的value值为准。

@Service
@CacheConfig(cacheNames = {"student"})
public class CacheServiceImpl implements CacheService {


    @Resource
    private StudentMapper studentMapper;

    @Override
    @Cacheable(key = "#id")  // 设置缓存,此时没有设置value值
    public Student getById(Long id) {
        Student student = studentMapper.selectById(id);
        return student;
    }
}

@CacheConfig解析

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CacheConfig {
  
    // 为缓存进行命名,类似于命名空间
    String[] cacheNames() default {};

    // key生成器
    String keyGenerator() default "";

    // 指定缓存管理器
    String cacheManager() default "";

    // 指定缓存获取解析器
    String cacheResolver() default "";
}

组合@Caching

有时候我们可能组合多个Cache注解使用,此时就需要@Caching组合多个注解标签了。

@Caching(
    cacheable = {
      @Cacheable(value = "student", key = "#id")
    },
    put = {
      @CachePut(value = "student", key="#id")
    },
    evict = {
      @CacheEvict(value = "student", key="#id")
    }
)
public Student cacheGroup(Long id) {
  return null;
}

原创文章,作者:jiafegn,如若转载,请注明出处:https://www.techlearn.cn/archives/500

Previous 2023年4月23日
Next 2023年4月23日

相关推荐

  • SpringBoot 打包

    SpringBoot 项目部署到服务器常见的方式就是,打包成 jar 包,通过 nohup java -jar 命令去运行项目,这也是官方推荐的一种方式。 导入依赖 打包 设置打包…

    springboot 2023年4月5日
    148
  • SpringBoot 整合Druid数据源

    简介 Druid是阿里巴巴开源的数据库连接池,号称是Java语言中最好的数据库连接池,能够提供强大的监控和扩展功能。 优点 引入依赖 这里使用的是SpringBoot整合版的Dru…

    2023年3月26日
    168
  • Springboot 注解 @Resource

    作用 和@Autowired注解类似,也是用来注入依赖对象的,spring容器会对bean中所有的字段、方法进行遍历,标注有@Resouce注解的,都会进行注入。@Autowire…

    springboot 2022年9月14日
    269
  • SpringBoot 依赖注入

    前言 SpringBoot 中通过注解实现依赖注入主要有以下几种: @Autowired注解 @Qualifier注解 @Resource注解 @Primary注解 @Autowi…

    springboot 2024年1月15日
    631
  • SpringBoot 整合Memcached

    简介 Memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态Web应用以减轻数据库负载,现在也有很多人将它作为内存式数据库在使用,memcached…

    springboot 2023年4月24日
    241
  • SpringBoot 整合RocketMQ

    简介 使用RocketMQ有两种方式,一种是引入rocketmq-client需要自己创建生产者和消费者,相对来说比较繁琐;另一种是引入rocketmq-spring-boot-s…

    springboot 2023年4月30日
    311
  • SpringBoot 全局异常统一处理

    前言 在实际的项目开发过程中,会有大量的异常发生,而我们并不能将异常信息反馈到用户,所以在返回结果的时候需要对异常进行处理,可是如果在每个Controller返回结果都需要进行异常…

    springboot 2023年4月29日
    125
  • SpringBoot 分布式定时任务-Quartz

    简介 Quartz是完全由Java开发的一个开源的作业调度框架。在业务系统中,主要用于做分布式定时任务。Spring本身提供的@Schedule只能实现一些相对简单的单机定时任务,…

    springboot 2023年12月17日
    371
  • Springboot 注解 @Primary

    作用 在注入依赖的过程中,当有多个候选者的时候,可以指定哪个候选者为主要的候选者。可以用在类上或者方法上面。通常定义bean常见的有2种方式:1、在类上标注@Component注解…

    springboot 2022年9月26日
    238
  • SpringBoot 过滤器

    简介 SpringBoot过滤器在web开发中可以过滤指定的URL,比如拦截掉不需要的接口请求,同时也可以对request和response的内容进行修改。 使用场景 Spring…

    springboot 2023年4月30日
    240