• Spring Cache


    Spring Cache

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

    Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术

    Spring Cache常用注解

    注解说明
    @EnableCaching开启缓存注解功能
    @Cacheable在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据,如果没有数据,调用方法并将方法返回值放到缓存中
    @CachePut将方法的返回值放到缓存中
    @CacheEvict将一条或多条数据从缓存中删除

    导入依赖坐标

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-data-redisartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-cacheartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在启动类中开启缓存注解@EnableCaching

    配置文件application.yml

    server:
      port: 8080
    spring:
      application:
        #应用的名称,可选
        name: cache_demo
      datasource:
        druid:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/cache_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
          username: root
          password: "20020630"
      redis:
        host: 192.168.205.1
        port: 6379
        database: 0
      cache:
        redis:
          time-to-live: 180000 #设置缓存过期时间,可选,单位是毫秒
    mybatis-plus:
      configuration:
        #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
        map-underscore-to-camel-case: true
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      global-config:
        db-config:
          id-type: ASSIGN_ID
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    Controller中

    @RestController
    @RequestMapping("/user")
    @Slf4j
    public class UserController {
    
        @Autowired
        private CacheManager cacheManager;
    
        @Autowired
        private UserService userService;
    
        /**
         * CachePut:将方法返回值放入缓存
         * value:缓存的名称,每个缓存名称下面可以有多个key
         * key:缓存的key
         */
        @CachePut(value = "userCache",key = "#user.id")
        @PostMapping
        public User save(User user){
            userService.save(user);
            return user;
        }
    
    
        /**
         * CacheEvict:清理指定缓存
         * value:缓存的名称,每个缓存名称下面可以有多个key
         * key:缓存的key
         */
        @CacheEvict(value = "userCache",key = "#p0")
        //@CacheEvict(value = "userCache",key = "#root.args[0]")
        //@CacheEvict(value = "userCache",key = "#id")
        @DeleteMapping("/{id}")
        public void delete(@PathVariable Long id){
            userService.removeById(id);
        }
    
        //@CacheEvict(value = "userCache",key = "#p0.id")
        //@CacheEvict(value = "userCache",key = "#user.id")
        //@CacheEvict(value = "userCache",key = "#root.args[0].id")
        @CacheEvict(value = "userCache",key = "#result.id")
        @PutMapping
        public User update(User user){
            userService.updateById(user);
            return user;
        }
    
        /**
         * Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
         * value:缓存的名称,每个缓存名称下面可以有多个key
         * key:缓存的key
         * condition:条件,满足条件时才缓存数据
         * unless:满足条件则不缓存
         */
        @Cacheable(value = "userCache",key = "#id",unless = "#result == null")
        @GetMapping("/{id}")
        public User getById(@PathVariable Long id){
            User user = userService.getById(id);
            return user;
        }
    
        @Cacheable(value = "userCache",key = "#user.id + '_' + #user.name")
        @GetMapping("/list")
        public List<User> list(User user){
            LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(user.getId() != null,User::getId,user.getId());
            queryWrapper.eq(user.getName() != null,User::getName,user.getName());
            List<User> list = userService.list(queryWrapper);
            return list;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
  • 相关阅读:
    详解C++代码从源代码到可执行文件的整个编译过程(预处理、编译、汇编和链接)
    【从入门到起飞】JavaSE—File的使用,构造方法,成员方法
    前端使用 Konva 实现可视化设计器(15)- 自定义连接点、连接优化
    案例分享|金融业数据运营运维一体化建设
    vue组件间传参以及方法调用总结
    【无标题】
    AI-多模态-2021:DALL-E模型【文本生成图像工具】【OpenAI】
    痞子衡嵌入式:MCUBootUtility v5.3发布,利用XMCD轻松使能外部RAM
    DI依赖注入和第三方bean管理以及核心容器
    前端组件封装:构建模块化、可维护和可重用的前端应用
  • 原文地址:https://blog.csdn.net/qq_57907966/article/details/126278419