(十七)、 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
集成有两种方式:
- 一种是我们直接引入
Caffeine
依赖,然后使用Caffeine
方法实现缓存。相当于使用原生api - 引入
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); }