Spring Boot缓存实战 Caffeine示例

 更新时间:2018年02月27日 14:07:40   作者:xiaolyuh  
本篇文章主要介绍了Spring Boot缓存实战 Caffeine示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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;
  }
}

源码:https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases

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

相关文章

  • Java利用File类创建文件的示例代码

    Java利用File类创建文件的示例代码

    这篇文章主要为大家详细介绍了如何利用Java中的File类创建文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • MapTask阶段shuffle源码分析

    MapTask阶段shuffle源码分析

    今天小编就为大家分享一篇关于MapTask阶段shuffle源码分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • IDEA如何开启并配置services窗口

    IDEA如何开启并配置services窗口

    在使用IntelliJ IDEA时,可能会遇到Services窗口不自动弹出的情况,本文介绍了如何手动开启Services窗口的简单步骤,首先,通过点击菜单栏中的“视图”->“工具窗口”->“服务”,或使用快捷键Alt+F8(注意快捷键可能存在冲突)来打开Services窗口
    2024-10-10
  • Netty与NIO超详细讲解

    Netty与NIO超详细讲解

    Netty本质上是一个NIO的框架,适用于服务器通讯相关的多种应用场景。底层是NIO,NIO底层是Java IO和网络IO,再往下是TCP/IP协议,下面我们跟随文章来详细了解
    2022-08-08
  • Java导出Word文档的实现方法详解

    Java导出Word文档的实现方法详解

    这篇文章主要给大家介绍了关于Java导出Word文档的实现方法,在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表、医院的患者统计报表、电商平台的销售报表等等,需要的朋友可以参考下
    2023-08-08
  • Jenkins自动部署Net Core过程图解

    Jenkins自动部署Net Core过程图解

    这篇文章主要介绍了Jenkins自动部署Net Core过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • springboot的logging.group日志分组方法源码流程解析

    springboot的logging.group日志分组方法源码流程解析

    这篇文章主要为大家介绍了springboot的logging.group日志分组方法源码流程解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • SpringBoot实现物品点赞功能

    SpringBoot实现物品点赞功能

    这篇文章主要介绍了SpringBoot物品点赞功能实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 详解Mybatis是如何解析配置文件的

    详解Mybatis是如何解析配置文件的

    这篇文章主要介绍了详解Mybatis是如何解析配置文件的,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • JavaWeb实现自动登录功能

    JavaWeb实现自动登录功能

    这篇文章主要为大家详细介绍了JavaWeb实现自动登录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论