• SpringBoot 整合 jetcache缓存


    目前 jetcache 支持的本地缓存方案有两种,远程缓存支持两种,分别如下:

    • 本地缓存(Local)
      • LinkedHashMap
      • Caffeine
    • 远程缓存(Remote)

    依赖导入

    <dependency>
        <groupId>com.alicp.jetcachegroupId>
        <artifactId>jetcache-starter-redisartifactId>
        <version>2.6.2version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    配置

    远程方案基本配置,当前默认使用的远程方案是 redis

    
    jetcache:
      statIntervalMinutes: 1
      local:
        default:
          type: linkedhashmap
          keyConvertor: fastjson
      remote:
        default:
          type: redis
          host: localhost
          port: 6379
          keyConvertor: fastjson
          valueEncode: java
          valueDecode: java
          poolConfig:
            maxTotal: 50
        localdemo:  # 自定义本地文件夹内(area)
          type: redis
          host: localhost
          port: 6379
          keyConvertor: fastjson
          valueEncode: java
          valueDecode: java
          poolConfig:
            maxTotal: 50
        remotedemo: # 自定义远程文件夹内(area)
          type: redis
          host: localhost
          port: 6379
          keyConvertor: fastjson
          valueEncode: java
          valueDecode: java
          poolConfig:
            maxTotal: 50
    
    • 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

    其中 poolConfig 是必配项,否则会报错

    步骤③:启用缓存,在引导类上方标注注解 @EnableCreateCacheAnnotation 配置 springboot 程序中可以使用注解的形式创建缓存

    @EnableCreateCacheAnnotation  # 可以不要,属性缓存注解
    @EnableMethodCache(basePackages = "com.example.demo")
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    cacheType 控制当前缓存使用本地缓存还是远程缓存,配置 cacheType=CacheType.LOCAL 即使用本地缓存。

    本地 + 远程方案

    在创建缓存的时候,配置 cacheType 为 BOTH 即则本地缓存与远程缓存同时使用。

    cacheType 如果不进行配置,默认值是 REMOTE,即仅使用远程缓存方案。关于 jetcache 的配置,参考以下信息

    属性默认值说明
    jetcache.statIntervalMinutes0统计间隔,0 表示不统计
    jetcache.hiddenPackages自动生成 name 时,隐藏指定的包名前缀
    jetcache.[local|remote].${area}.type缓存类型,本地支持 linkedhashmap、caffeine,远程支持 redis、tair
    jetcache.[local|remote].${area}.keyConvertorkey 转换器,当前仅支持 fastjson
    jetcache.[local|remote].${area}.valueEncoderjava仅 remote 类型的缓存需要指定,可选 java 和 kryo
    jetcache.[local|remote].${area}.valueDecoderjava仅 remote 类型的缓存需要指定,可选 java 和 kryo
    jetcache.[local|remote].${area}.limit100仅 local 类型的缓存需要指定,缓存实例最大元素数
    jetcache.[local|remote].${area}.expireAfterWriteInMillis无穷大默认过期时间,毫秒单位
    jetcache.local.${area}.expireAfterAccessInMillis0仅 local 类型的缓存有效,毫秒单位,最大不活动间隔

    以上方案仅支持手工控制缓存,但是 springcache 方案中的方法缓存特别好用,给一个方法添加一个注解,方法就会自动使用缓存。jetcache 也提供了对应的功能,即方法缓存。

    
    package com.example.demo.controller;
    
    import com.alicp.jetcache.anno.*;
    import com.example.demo.entity.User;
    import com.example.demo.service.IUserService;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @author 蔡定努
     * @date 2023/10/05 14:41
     */
    @RestController
    public class CacheController {
    
        @Resource
        private IUserService userService;
    
    
        /**
         * 使用缓存
         * @author 蔡定努
         */
        @GetMapping("get")
        @Cached(name = "user:", key = "#id", expire = 36000, cacheType = CacheType.BOTH)
        @CacheRefresh(refresh = 5,timeUnit = TimeUnit.MINUTES) //定时刷新缓存
        public User get(String id) {
            return userService.getById(id);
        }
    
    
        @GetMapping("areaGet")
        @Cached(area = "demo",name = "user:", key = "#id", expire = 36000, cacheType = CacheType.REMOTE)
        public User areaGet(String id) {
            return userService.getById(id);
        }
    
        /**
         * 
         * 删除缓存
         * @author 蔡定努
         */
        @GetMapping("in")
        @CacheInvalidate(name = "user:", key = "#id")
        public void invaid(String id) {
    //     数据处理逻辑
    
    
        }
    
    
        /**
         * 更新缓存
         * @author 蔡定努
         */
        @PostMapping("upadte")
        @CacheUpdate(name = "user:", key = "#id", value = "#user")
        public void upadte(@RequestBody  User user) {
    //        跟新user
            userService.updateById(user);
    //        int a=1/0;  //缓存不一致
        }
    
    
    
    }
    
    
    • 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
    • 72
    • 73

    设置后,每 1 分钟在控制台输出缓存数据命中信息

    2023-10-05 16:15:00.013  INFO 16027 --- [DefaultExecutor] c.alicp.jetcache.support.StatInfoLogger  : jetcache stat from 2023-10-05 16:14:28,692 to 2023-10-05 16:15:00,003
    cache     |       qps|   rate|           get|           hit|          fail|        expire|avgLoadTime|maxLoadTime
    ----------+----------+-------+--------------+--------------+--------------+--------------+-----------+-----------
    demo_user:|      0.08| 50.00%|             2|             1|             0|             0|      149.0|        149
    ----------+----------+-------+--------------+--------------+--------------+--------------+-----------+-----------
    
    • 1
    • 2
    • 3
    • 4
    • 5

    总结

    1. jetcache 是一个类似于 springcache 的缓存解决方案,自身不具有缓存功能,它提供有本地缓存与远程缓存多级共同使用的缓存解决方案
    2. 注意数据进入远程缓存时的类型转换问题
    3. jetcache 提供方法缓存,并提供了对应的缓存更新与刷新功能
    4. jetcache 提供有简单的缓存信息命中报表方便开发者即时监控缓存数据命中情况
  • 相关阅读:
    解决方案:反弹shell之后没法通过上下键调出历史命令
    重学FreeRTOS操作系统之任务篇(一)
    【最全】PS各个版本下载安装及小试牛刀教程(PhotoShop CS3 ~~ PhotoShop 2022)
    Arduino驱动VEML7700传感器(光照传感器篇)
    kubernetes数据持久化StorageClass动态供给(二)
    python opencv之图像分割、计算面积
    第十九章绘图
    服务器远程桌面经常连接不上,造成远程桌面连接不上的原因都有哪些
    团结引擎已全面支持 OpenHarmony 操作系统
    LabVIEW项目中实时目标出现黄色感叹号
  • 原文地址:https://blog.csdn.net/caidingnu/article/details/133580958