(十七)、 SpringBoot 集成 Caffeine 实现本地缓存

(十七)、 SpringBoot 集成 Caffeine 实现本地缓存

 

 

1、简介

github:  https://github.com/ben-manes/caffeine

Caffeine 是高性能的本地(进程内)缓存框架。提供接近最佳的命中率。

2、maven依赖

<dependency>
  <groupId>com.github.ben-manes.caffeine</groupId>
  <artifactId>caffeine</artifactId>
  <version>3.0.5</version>
</dependency>

 

3、集成caffeine

Caffeine与 SpringBoot集成有两种方式:

  1. 一种是我们直接引入 Caffeine 依赖,然后使用 Caffeine 方法实现缓存。相当于使用原生api
  2. 引入 Caffeine 和 Spring Cache 依赖,使用 SpringCache 注解方法实现缓存。

方式一(直接使用 Caffeine Api方式):

1、添加以上maven依赖。

2、配置一个Cache,通过构造者模式构建一个Cache对象,然后后续关于缓存的增删查都是基于这个cache对象。这种方式使用的话是对代码有侵入性的。

@Configuration
public class CacheConfig {
    @Bean
    public Cache<String, Object> caffeineCache() {
        return Caffeine.newBuilder()
                // 设置最后一次写入或访问后经过固定时间过期
                .expireAfterWrite(60, TimeUnit.SECONDS)
                // 初始的缓存空间大小
                .initialCapacity(100)
                // 缓存的最大条数
                .maximumSize(1000)
                .build();
    }

Caffeine 配置说明:

  • initialCapacity: 初始的缓存空间大小。

  • maximumSize: 缓存的最大数量。

  • maximumWeight: 缓存的最大权重。

  • expireAfterAccess: 最后一次读或写操作后经过指定时间过期。

  • expireAfterWrite: 最后一次写操作后经过指定时间过期。

  • refreshAfterWrite: 创建缓存或者最近一次更新缓存后经过指定时间间隔,刷新缓存。

  • weakKeys: 打开key的弱引用。弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

  • weakValues:打开value的弱引用。

  • softValues:打开value的软引用。软引用: 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。

  • recordStats:开发统计功能。

注意:

  • weakValues 和 softValues 不可以同时使用。

  • maximumSize 和 maximumWeight 不可以同时使用。

  • expireAfterWrite 和 expireAfterAccess 同事存在时,以 expireAfterWrite 为准。

3、使用Api

3.1、手动添加数据

@Autowired
Cache<String, Object> caffeineCache;
// 手动添加数据
cache.put("java-study", "java-study");
System.out.println(cache.getIfPresent("java-study"));

3.2、自动添加(自定义添加函数)

// 1.如果缓存中能查到,则直接返回
// 2.如果查不到,则从我们自定义的getValue方法获取数据,并加入到缓存中
String val = cache.get("java-study", k -> getValue(k));
System.out.println(val);
/**
* 缓存中找不到,则会进入这个方法。一般是从数据库获取内容
* @param k
* @return
*/
private static String getValue(String k) {
return k + ":value";
}

3.3、删除

  • 单个删除:Cache.invalidate(key)

  • 批量删除:Cache.invalidateAll(keys)

  • 删除所有缓存项:Cache.invalidateAll

 

方式二(SpringCache + Caffeine):

1、maven依赖:

<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>3.0.5</version>
</dependency>

2、需要在SpingBoot启动类标上@EnableCaching注解

3、在application.yml配置我们的使用的缓存类型、过期时间、缓存策略等。

spring:
  profiles:
    active: dev
  cache:
    type: CAFFEINE
    caffeine:
      spec: maximumSize=500,expireAfterAccess=600s

如果我们不习惯使用这种方式的配置,当然我们也可以使用JavaConfig的配置方式来代替配置文件。

@Configuration
public class CacheConfig {
        @Bean
        public CacheManager cacheManager() {
            CaffeineCacheManager cacheManager = new CaffeineCacheManager();
            cacheManager.setCaffeine(Caffeine.newBuilder()
                    // 设置最后一次写入或访问后经过固定时间过期
                    .expireAfterAccess(600, TimeUnit.SECONDS)
                    // 初始的缓存空间大小
                    .initialCapacity(100)
                    // 缓存的最大条数
                    .maximumSize(500));
            return cacheManager;
        }

4、接下来就是代码中如何来使用这个缓存了

    @Override
    @CachePut(value = "user", key = "#userDTO.id")
    public UserDTO save(UserDTO userDTO) {
        userRepository.save(userDTO);
        return userDTO;
    }

    @Override
    @CacheEvict(value = "user", key = "#id")//2
    public void remove(Long id) {
        logger.info("删除了id、key为" + id + "的数据缓存");
    }

    @Override
    @Cacheable(value = "user",key = "#id")
    public UserDTO getUserById(Long id) {
        return userRepository.findOne(id);
    }

 

 

posted @ 2022-02-10 23:26  邓维-java  阅读(3791)  评论(0编辑  收藏  举报