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

Spring | Spring Cache 缓存框架

Spring Cache 缓存框架:

    • Spring Cache功能介绍
    • Spring Cache的Maven依赖
    • Spring Cache的常用注解
      • @EnableCaching注解
      • @CachePut注解
      • @Cacheable注解
      • @CacheEvict注解

Spring Cache功能介绍

  • Spring CacheSpring的一个框架,实现了基于注解的缓存功能。只需简单加一个注解,就能实现缓存功能

  • Spring Cache提供了一层抽象底层可以切换不同的缓存实现。比较常见的(底层)缓存实现有:

    Redis、EHCache、Caffeine。可自定义地修改Spring Cache底层的缓存实现比如: 你想用Redis进行缓存,可修改Spring Cache配置,让其底层通过Redis来实现缓存功能。

  • 在具体的项目中,想切换Spring Cache底层的“缓存实现”时
    只需修改该 “缓存实现”的依赖Spring Cache底层就会自动切换“缓存实现”
    例如:此时的底层的缓存实现为: EHCache,想修改为Redis,只需把Redis依赖修改为EHCache的依赖即可。 (当然你的电脑得提前装好Redis、配置好Redis)

Spring Cache的Maven依赖

       <!--  Spring-data-redis依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

  <!-- Spring Cache的依赖,结合上面的Redis依赖,所以该Cache框架的底层“缓存实现”为: Redis  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

Spring Cache的常用注解

@EnableCaching注解

  • 通常加在类 (启动类 )上,用于 开启缓存注解功能

在这里插入图片描述

  • @Slf4j
    @SpringBootApplication
    @EnableCaching  //开启缓存注解功能
    public class CacheDemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(CacheDemoApplication.class,args);
            log.info("项目启动成功...");
        }
    }
    

@CachePut注解

  • 一般加在方法上方法的返回值放到缓存
    只能“放”缓存数据

  •   @PostMapping
        /*
         * 当数据插入到数据库的同时,还需要把这个数据保存到Redis中一份(进行数据的缓存),
         * 此时可用Spring Cache框架的 @CachePut注解 :将方法的返回值存入到缓存中。
         */
        //使用Spring Cache缓存数据
        /* 如果此时User的id为1,那么存入Redis中的“key名称”为: userCache::1 */
        @CachePut(cacheNames = "userCache",key = "#user.id")
        public User save(@RequestBody User user){
            userMapper.insert(user);
            return user;
        }
    

    @CachePut注解的多种实现方式:

在这里插入图片描述

  •   @PostMapping
        /*
         * 当数据插入到数据库的同时,还需要把这个数据保存到Redis中一份(进行数据的缓存),
         * 此时可用Spring Cache框架的 @CachePut注解 :将方法的返回值存入到缓存中。
         */
        //使用Spring Cache缓存数据
        /* 如果此时User的id为1,那么存入Redis中的“key名称”为: userCache::1 */
        @CachePut(cacheNames = "userCache",key = "#user.id")
    
        /* #result得到是一个User对象,结合该对象的id,生成存入Redis数据库中的 key */
         @CachePut(cacheNames = "userCache",key = "#result.id") //存入Redis的key名为: userCache::1 --对象导航
    
        /* #p0 : 获得save()方法的第一个参数,即User对象 */
        @CachePut(cacheNames = "userCache",key = "#p0.id") //存入Redis的key名为: userCache::1
    
        /* #a0 : 获得方法的第一个参数,... */
        @CachePut(cacheNames = "userCache",key = "#a0.id") //存入Redis的key名为: userCache::1
    
        /* #root.args[1] : 获得第一个参数 */
        @CachePut(cacheNames = "userCache",key = "#root.args[1].id") //存入Redis的key名为: userCache::1
        //上面的@CachePut()注解选其中一个使用即可。
        public User save(@RequestBody User user){
            userMapper.insert(user);
            return user;
        }
    

@Cacheable注解

  • 一般加在方法上在方法执行前,先查询缓存中是否有数据如果有数据,则直接返回缓存数据如果没有缓存数据,调用方法并将方法返回值放到缓存中
    即“可”取缓存数据,也可“放”缓存数据

在这里插入图片描述

  •  @GetMapping
         /*
          在方法执行前,先查询缓存中是否有数据,如果有数据,则直接返回缓存数据。
          如果没有缓存数据,调用方法并将方法返回值放到缓存中。
         */
        @Cacheable(cacheNames = "userCache",key = "#id") // key的生成 : userCache::10
        public User getById(Long id){ //如果该id的值为: 10
            User user = userMapper.getById(id);
            return user;
      }
    

@CacheEvict注解

  • 一般加在方法上,有 一条多条缓存数据从缓存中删除

在这里插入图片描述

  •    /*
          数据库中的数据被删掉了,对应的也需要给清理掉 (清除一条缓存数据)
         */
        @CacheEvict(cacheNames="userCache",key ="#id") //清理一条或多条缓存数据
        @DeleteMapping
        public void deleteById(Long id){
            userMapper.deleteById(id);
        }
    
        /*
         数据库中的数据被删掉了,对应的也需要给清理掉 (清除多条缓存数据)
        */
    @CacheEvict(cacheNames = "userCache",allEntries = true) //清理一条或多条缓存数据
    	@DeleteMapping("/delAll")
        public void deleteAll(){
            userMapper.deleteAll();
     }
    

http://www.kler.cn/a/106100.html

相关文章:

  • 实用教程:如何无损修改MP4视频时长
  • 无人机场景 - 目标检测数据集 - 车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」
  • 杰控通过 OPCproxy 获取数据发送到服务器
  • Jenkins的pipeline Script的 每个组件的详细讲解
  • 人工智能训练师 综合测试题库一
  • 【windows笔记】08-Windows中的各种快捷方式、符号链接、目录联接、硬链接的区别和使用方法
  • 将CSDN或Confluence文章转为微信公众号格式
  • torch VS tensorflow 同功能的api
  • Flutter和SwiftUI比较
  • 目标跟踪ZoomTrack: Target-aware Non-uniform Resizing for Efficient Visual Tracking
  • LeetCode二分查找
  • 如何为你的地图数据设置地图样式?
  • 华为---DHCP中继代理简介及示例配置
  • Databend 开源周报第 116 期
  • springcloud笔记 (8) -网关 Gateway
  • 结构伪类选择器
  • 小红书素人铺量推广费用是多少?
  • Netty进阶-黏包半包
  • 达芬奇MacOS最新中文版 DaVinci Resolve Studio 18中文注册秘钥
  • Go并发:使用sync.Pool来性能优化
  • Python深度学习实战-基于tensorflow.keras六步法搭建神经网络(附源码和实现效果)
  • 聊聊springboot的TomcatMetricsBinder
  • 什么是React中的高阶组件(Higher Order Component,HOC)?它的作用是什么?
  • 【EI会议征稿】2024年电力电子与人工智能国际学术会议(PEAI 2024)
  • 大数据-Storm流式框架(二)--wordcount案例
  • 在项目中同时使用SpringCloud和Dubbo,注册中心选用Eureka?