Spring boot Caffeine缓存(一)——CacheManager与配置文件

  1. Spring boot Caffeine缓存(一)——CacheManager与配置文件
  2. Spring boot Caffeine缓存(二)——Cache、LoadingCache
  3. Spring boot Caffeine缓存(三)——使用注解

spring5(springboot2)开始用Caffeine取代guava,至于其性能对比可以参考Caffeine给的测试结果各缓存性能对比
这里贴出一个读写的对比
这里写图片描述

Caffeine在springboot中集成非常简单,可以通过配置文件来设置

spring:
  cache:
    cache-names: outLimit,notOutLimit
    caffeine:
      spec: initialCapacity=50,maximumSize=500,expireAfterWrite=5s,refreshAfterWrite=7s
    type: caffeine

这种方法设置的简单,但是灵活性不够高,如上边设置的cache(cache name)所有的规则都是一样的。这块我没深入研究,不多做介绍。

也可以通过代码配置
这里写图片描述

左边这块是我在看Caffeine时做的一些配置。这些东西很多,我可能会分多篇文章来讲。

先来说下最常用的CacheManager

CacheManager

CacheManager的使用场景比较多,最常见的@Cacheable、@CachePut、@CacheEvict等默认都可以配合CacheManager使用。

先看下我集成的三个CacheManager

    @Value("${caffeine.spec}")
    private String caffeineSpec;

    @Autowired
    private CacheLoader cacheLoader;


    @Bean
    public CacheManager cacheManagerWithCacheLoading(){
        logger.info("cacheManagerWithCacheLoading" );
        Caffeine caffeine = Caffeine.newBuilder()
                .initialCapacity(100)
                .maximumSize(1000)
//                .refreshAfterWrite(5,TimeUnit.SECONDS)
                .expireAfterWrite(50,TimeUnit.SECONDS);

        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        cacheManager.setAllowNullValues(true);
        cacheManager.setCaffeine(caffeine);
//        cacheManager.setCacheLoader(cacheLoader);
        cacheManager.setCacheNames(getNames());
        return cacheManager;
    }



    @Bean(name = "caffeine")
    @Primary
    public CacheManager cacheManagerWithCaffeine(){
        logger.info("This is cacheManagerWithCaffeine");
        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        Caffeine caffeine = Caffeine.newBuilder()
                //cache的初始容量值
                .initialCapacity(100)
                //maximumSize用来控制cache的最大缓存数量,maximumSize和maximumWeight不可以同时使用,
                .maximumSize(1000);
                //控制最大权重
//                .maximumWeight(100);
//                .expireAfter();
                //使用refreshAfterWrite必须要设置cacheLoader
//                .refreshAfterWrite(5,TimeUnit.SECONDS);
        cacheManager.setCaffeine(caffeine);
//        cacheManager.setCacheLoader(cacheLoader);
        cacheManager.setCacheNames(getNames());
//        cacheManager.setAllowNullValues(false);
        return cacheManager;
    }

    @Bean(name = "caffeineSpec")
    public CacheManager cacheManagerWithCaffeineFromSpec(){
        CaffeineSpec spec = CaffeineSpec.parse(caffeineSpec);
        Caffeine caffeine = Caffeine.from(spec);
        //此方法等同于上面from(spec)
//        Caffeine caffeine = Caffeine.from(caffeineSpec);

        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        cacheManager.setCaffeine(caffeine);
        cacheManager.setCacheNames(getNames());
        return cacheManager;
    }

    private static List<String> getNames(){
        List<String> names = new ArrayList<>(2);
        names.add("outLimit");
        names.add("notOutLimit");
        return names;
    }

CacheLoader会在后面介绍,它是cache的一种加载策略,key不存在或者key过期之类的都可以通过CacheLoader来获得/重新获得数据。

cacheManagerWithCaffeine这个bean是以Caffeine为基础来设置一个CacheManager。如果设置refreshAfterWrite的话后边必须要设置cacheLoader。如果不设置的话,项目启动的时候会抛异常。
这里有个setCacheNames,主要是用来创建多个cache的,但是多个cache使用相同的策略。

cacheManagerWithCacheLoading这个bean是创建了一个带有CacheLoader的bean。它跟cacheManagerWithCaffeine这块的主要区别是,最初我在cacheManagerWithCaffeine里只是想创建一个简单的key-value存储,没有CacheLoader模块,所以cacheManagerWithCaffeine这个bean如果里边的key过期或不存在cache中是获取不到数据的,直接返回null。但是cacheManagerWithCacheLoading不同,如果key过期或不存在会从他的CacheLoader策略里重新加载数据。

cacheManagerWithCaffeineFromSpec是通过spec来创建cacheManager。
先看下面两行代码

        CaffeineSpec spec = CaffeineSpec.parse(caffeineSpec);
        Caffeine caffeine = Caffeine.from(spec);

caffeineSpec这里是从配置文件中获取的配置,如配置文件设置如下

caffeine:
  spec: initialCapacity=50,maximumSize=500,expireAfterWrite=5s

caffeineSpec是个符合其规则的字符串。
进入其源码

  @SuppressWarnings("StringSplitter")
  public static CaffeineSpec parse(String specification) {
    CaffeineSpec spec = new CaffeineSpec(specification);
    for (String option : specification.split(SPLIT_OPTIONS)) {
      spec.parseOption(option.trim());
    }
    return spec;
  }

可以看到其处理方式,非常简单。
Caffeine caffeine = Caffeine.from(spec);这行就是加载spec中的信息,自己点击下就知道什么意思了。

代码中写了很多注释,这里不多做解释了,如果有不明白的可以留言,或者在后边我会介绍其它块的时候点出。

代码的github地址Caffeine。这只是我自己摸索的时候写的,有些不太规范,仅供大家参考。

Camunda是个流程管理平台,它本身并不直接提供Spring Boot的整合或配置缓存功能。但是,你可以将Camunda和Spring Boot结合使用,并通过Spring框架来添加缓存支持。 首先,在Spring Boot项目中集成Camunda,通常会使用camunda-bpm-spring-boot-starter包,它包含了Camunda的整合配置。然后,为了配置缓存,可以采用以下步骤: 1. **引入依赖**:在你的`pom.xml`或`build.gradle`文件中添加Spring Cache相关的依赖,如Spring Data JPA的二级缓存或Redis、Hazelcast等缓存库。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> ``` 2. **配置缓存管理器**:在Spring Boot的配置类`ApplicationConfig`中设置缓存管理器。例如,如果使用Spring Data JPA的缓存,可能会配置`hibernate.cache.region.factory_class`属性。 ```java @Configuration @EnableCaching public class CacheConfig { @Bean public CacheManager cacheManager() { // 如果使用JCache,配置Caffeine或Ehcache CacheManager return new CaffeineCacheManager(); } } ``` 3. **启用Camunda的缓存策略**:在处理业务流程映射时,你可以利用Camunda的API来控制是否使用缓存。例如,当从数据库获取用户任务数据时,可以开启缓存来提高性能。 4. **在Camunda服务中使用缓存**:在处理BPMN流程实例或者任务时,确保注入了`ProcessEngineConfiguration`对象,这个对象允许你配置Camunda的行为,包括使用缓存。 ```java @Autowired private ProcessEngineConfiguration processEngineConfiguration; processEngineConfiguration.setEnableProcessDefinitionCache(true); ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值