package com.mh.user.config; import com.github.benmanes.caffeine.cache.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.concurrent.TimeUnit; /** * @author LJF * @title : * @description 使用caffeine缓存技术 * @updateTime 2020-12-15 * @throws : */ @Configuration public class CaffeineCacheConfig { // 软引用: 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。 // 弱引用: 弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象, // 不管当前内存空间足够与否,都会回收它的内存 @Bean(name = "caffeineCache") public Cache caffeineCache() { return Caffeine.newBuilder() // 软引用 .softValues() // 弱引用 // .weakValues() // 设置最后一次写入或访问后经过固定时间过期 .expireAfterWrite(8*60*60, TimeUnit.SECONDS) // 初始的缓存空间大小 .initialCapacity(100) // 缓存的最大条数 .maximumSize(1000) .build(); } //定义缓存,可直接使用 @Bean public LoadingCache expiryCache(){ LoadingCache loadingCache = Caffeine.newBuilder() .initialCapacity(100) .maximumSize(1000) //缓存写入/删除监控 .writer(new CacheWriter() { @Override public void write(Object key, Object value) { //此方法是同步阻塞的 System.out.println("--缓存写入--:key=" + key + ", value=" + value); } @Override public void delete(Object key, Object value, RemovalCause cause) { System.out.println("--缓存删除--:key=" + key); } }) .expireAfterAccess(6, TimeUnit.HOURS) //过期时间 .build((String key)->"刷新的数据"); //cacheload实现类,刷新时候调用 // loadingCache.put("name","侯征"); return loadingCache; } }