欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Boot缓存实战 Caffeine示例

程序员文章站 2022-03-10 10:51:37
caffeine和spring boot集成 caffeine是使用java8对guava缓存的重写版本,在spring boot 2.0中将取代guava。如果出现ca...

caffeine和spring boot集成

caffeine是使用java8对guava缓存的重写版本,在spring boot 2.0中将取代guava。如果出现caffeine,caffeinecachemanager将会自动配置。使用spring.cache.cache-names属性可以在启动时创建缓存,并可以通过以下配置进行自定义(按顺序):

  • spring.cache.caffeine.spec: 定义的特殊缓存
  • com.github.benmanes.caffeine.cache.caffeinespec: bean定义
  • com.github.benmanes.caffeine.cache.caffeine: bean定义

例如,以下配置创建一个foo和bar缓存,最大数量为500,存活时间为10分钟:

spring.cache.cache-names=foo,bar
spring.cache.caffeine.spec=maximumsize=500,expireafteraccess=600s

除此之外,如果定义了com.github.benmanes.caffeine.cache.cacheloader,它会自动关联到caffeinecachemanager。由于该cacheloader将关联被该缓存管理器管理的所有缓存,所以它必须定义为cacheloader<object, object>,自动配置将忽略所有泛型类型。

引入依赖

<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-cache</artifactid>
</dependency>
<dependency>
  <groupid>com.github.ben-manes.caffeine</groupid>
  <artifactid>caffeine</artifactid>
  <version>2.6.0</version>
</dependency>

开启缓存的支持

使用@enablecaching注解让spring boot开启对缓存的支持

@springbootapplication
@enablecaching// 开启缓存,需要显示的指定
public class springbootstudentcachecaffeineapplication {

  public static void main(string[] args) {
    springapplication.run(springbootstudentcachecaffeineapplication.class, args);
  }
}

配置文件

新增对缓存的特殊配置,如最大容量、过期时间等

spring.cache.cache-names=people
spring.cache.caffeine.spec=initialcapacity=50,maximumsize=500,expireafterwrite=10s,refreshafterwrite=5s

如果使用了refreshafterwrite配置还必须指定一个cacheloader,如:

/**
 * 必须要指定这个bean,refreshafterwrite=5s这个配置属性才生效
 *
 * @return
 */
@bean
public cacheloader<object, object> cacheloader() {
  cacheloader<object, object> cacheloader = new cacheloader<object, object>() {

    @override
    public object load(object key) throws exception {
      return null;
    }

    // 重写这个方法将oldvalue值返回回去,进而刷新缓存
    @override
    public object reload(object key, object oldvalue) throws exception {
      return oldvalue;
    }
  };
  return cacheloader;
}

caffeine配置说明:

  1. initialcapacity=[integer]: 初始的缓存空间大小
  2. maximumsize=[long]: 缓存的最大条数
  3. maximumweight=[long]: 缓存的最大权重
  4. expireafteraccess=[duration]: 最后一次写入或访问后经过固定时间过期
  5. expireafterwrite=[duration]: 最后一次写入后经过固定时间过期
  6. refreshafterwrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存
  7. weakkeys: 打开key的弱引用
  8. weakvalues:打开value的弱引用
  9. softvalues:打开value的软引用
  10. recordstats:开发统计功能

注意:

  1. expireafterwrite和expireafteraccess同事存在时,以expireafterwrite为准。
  2. maximumsize和maximumweight不可以同时使用
  3. weakvalues和softvalues不可以同时使用

示例代码

/**
 * @author yuhao.wang
 */
@service
public class personserviceimpl implements personservice {
  private static final logger logger = loggerfactory.getlogger(personserviceimpl.class);

  @autowired
  personrepository personrepository;

  @override
  @cacheput(value = "people", key = "#person.id")
  public person save(person person) {
    person p = personrepository.save(person);
    logger.info("为id、key为:" + p.getid() + "数据做了缓存");
    return p;
  }

  @override
  @cacheevict(value = "people")//2
  public void remove(long id) {
    logger.info("删除了id、key为" + id + "的数据缓存");
    //这里不做实际删除操作
  }

  /**
   * cacheable
   * value:缓存key的前缀。
   * key:缓存key的后缀。
   * sync:设置如果缓存过期是不是只放一个请求去请求数据库,其他请求阻塞,默认是false。
   */
  @override
  @cacheable(value = "people", key = "#person.id", sync = true)
  public person findone(person person, string a, string[] b, list<long> c) {
    person p = personrepository.findone(person.getid());
    logger.info("为id、key为:" + p.getid() + "数据做了缓存");
    return p;
  }

  @override
  @cacheable(value = "people1")//3
  public person findone1() {
    person p = personrepository.findone(2l);
    logger.info("为id、key为:" + p.getid() + "数据做了缓存");
    return p;
  }

  @override
  @cacheable(value = "people2")//3
  public person findone2(person person) {
    person p = personrepository.findone(person.getid());
    logger.info("为id、key为:" + p.getid() + "数据做了缓存");
    return p;
  }
}

源码:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。