SpringBoot 整合 jetcache缓存

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

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

    • Tair

依赖导入

xml 复制代码
<dependency>
    <groupId>com.alicp.jetcache</groupId>
    <artifactId>jetcache-starter-redis</artifactId>
    <version>2.6.2</version>
</dependency>

配置

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

yaml 复制代码
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

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

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

java 复制代码
@EnableCreateCacheAnnotation  # 可以不要,属性缓存注解
@EnableMethodCache(basePackages = "com.example.demo")
public class DemoApplication {

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


}

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

本地 + 远程方案

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

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

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

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

java 复制代码
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 分钟在控制台输出缓存数据命中信息

shell 复制代码
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. jetcache 是一个类似于 springcache 的缓存解决方案,自身不具有缓存功能,它提供有本地缓存与远程缓存多级共同使用的缓存解决方案
  2. 注意数据进入远程缓存时的类型转换问题
  3. jetcache 提供方法缓存,并提供了对应的缓存更新与刷新功能
  4. jetcache 提供有简单的缓存信息命中报表方便开发者即时监控缓存数据命中情况
相关推荐
hanbarger28 分钟前
mybatis框架——缓存,分页
java·spring·mybatis
苹果醋31 小时前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行1 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
azhou的代码园1 小时前
基于JAVA+SpringBoot+Vue的制造装备物联及生产管理ERP系统
java·spring boot·制造
弗罗里达老大爷1 小时前
Redis
数据库·redis·缓存
wm10432 小时前
java web springboot
java·spring boot·后端
别这么骄傲2 小时前
lookup join 使用缓存参数和不使用缓存参数的执行前后对比
缓存
龙少95433 小时前
【深入理解@EnableCaching】
java·后端·spring
路在脚下@9 小时前
spring boot的配置文件属性注入到类的静态属性
java·spring boot·sql
啦啦右一9 小时前
Spring Boot | (一)Spring开发环境构建
spring boot·后端·spring