呃.................................
....................废话不多说,直接干代码
1、先添加pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
spring-boot版本是:2.4.2
2、启动类添加开启缓存注解
@EnableCaching
3、添加缓存配置文件
@Configuration
public class CacheConfig {
@Value("${cache.time}")
private String cacheTime;
@Bean("caffeineCacheManager")
public CacheManager cacheManager() {
CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
caffeineCacheManager.setCaffeine(getCaffeine());
caffeineCacheManager.setCacheLoader(cacheLoader());
//是否允许值为空
caffeineCacheManager.setAllowNullValues(false);
return caffeineCacheManager;
}
@Bean
public CacheLoader<Object, Object> cacheLoader() {
return new CacheLoader<Object, Object>() {
@Override
public @Nullable
Object load(@NonNull Object key) throws Exception {
// 这里我们就可以从数据库或者其他地方查询最新的数据
return null;
}
@Override
public @Nullable
Object reload(@NonNull Object key, @NonNull Object oldValue) throws Exception {
System.out.println("--refresh--:" + key);
return oldValue;
}
};
}
@Bean
public LoadingCache getCache() {
LoadingCache build = getCaffeine().build(cacheLoader());
return build;
}
@Bean
public Caffeine getCaffeine() {
Integer time = Integer.parseInt(StringUtils.isEmpty(cacheTime) ? "1440" : cacheTime);
Caffeine caffeine = Caffeine.newBuilder()
//设置过期时间。最后一次写入或访问后过多久过期。
.expireAfterAccess(time * 60, TimeUnit.SECONDS)
//cache的初始容量值
.initialCapacity(100)
//maximumSize用来控制cache的最大缓存数量,maximumSize和maximumWeight(最大权重)不可以同时使用,
.maximumSize(1000)
//弱引用
// .weakKeys()
// .weakValues()
//创建或更新之后多久刷新,需要设置cacheLoader
// .refreshAfterWrite(10, TimeUnit.SECONDS)
//缓存写入/删除 监控
.writer(new CacheWriter<Object, Object>() {
@Override
public void write(@NonNull Object key, @NonNull Object value) {
System.out.println("缓存写入: key= " + key + ";value=" + value);
}
@Override
public void delete(@NonNull Object key, @Nullable Object value, @NonNull RemovalCause cause) {
System.out.println("缓存删除: key= " + key + ";value=" + value);
}
})
.recordStats();
return caffeine;
}
}
我这里时间是用的读取的外部配置文件,方便修改。
缓存更新策略:
expireAfterAccess(long, TimeUnit):在最后一次访问或者写入后开始计时,在指定的时间后过期。假如一直有请求访问该key,那么这个缓存将一直不会过期。
expireAfterWrite(long, TimeUnit)::在最后一次写入缓存后开始计时,在指定的时间后过期。
expireAfter(Expiry)::自定义策略,过期时间由Expiry实现独自计算。
4、使用
在需要的方法上面添加注解:@Cacheable、@CacheEvict、@CachePut
@Cacheable(cacheNames = "userInfo", key = "#param.uid+'_'+#param.uname")
public List<UserInfo> getUserInfo(UserParam param) {
// 查询数据信息
}
5、完
本文内容简单,后面有时间再丰富。