springboot整合guava实现本地缓存
springboot整合guava实现本地缓存
一、Springboot缓存
SpringBoot支持很多种缓存方式:redis、guava、ehcahe、jcache等等。
二、guava介绍
Guava Cache 是 Google 开源的一套开发工具集合,Guava Cache 是其中的一个专门用于处理本地缓存的轻量级框架,是全内存方式的本地缓存,而且是线程安全的。 和 ConcurrentMap 相比,Guava Cache 可以限制内存的占用,并可设置缓存的过期时间,可以自动回收数据,而 ConcurrentMap 只能通过静态方式来控制缓存,移除数据元素需要显示的方式来移除。
三、 缓存回收方式
1、基于容量回收
2、基于时间回收
3、基于引用回收
CacheBuilder.weakValues():和 CacheBuilder.weakKeys() 方法类似,该方法按照弱引用方式来存储缓存项的值,允许系统垃圾回收时回收缓存项。 CacheBuilder.weakValues(),使用软引用方式来包装缓存值,只有在内存需要时(一般在接近内存溢出时),系统会按照全局LRU(least-recently-used)原则进行垃圾回收。考虑到垃圾回收的性能问题,推荐使用基于容量的回收方式。
4、手动回收
guava使用
导入依赖
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>20.0</version> </dependency>
recordStats:开启统计功能 stats:查看统计情况
void testRecordStats(){ Cache<String, String> callCache = CacheBuilder.newBuilder(). initialCapacity(5) .maximumSize(100) .recordStats() .expireAfterAccess(1, TimeUnit.SECONDS) .build(); /** * CacheStats{hitCount=0, missCount=0, loadSuccessCount=0, loadExceptionCount=0, totalLoadTime=0, evictionCount=0} */ CacheStats stats = callCache.stats(); System.out.println(stats); }
并发级别 调整concurrencyLevel即可
5、代码实例
/** * @Author sprem至尊 * @Date 2022/10/24 19:39 * @Version 1.0 */ package com.cn.xiaonuo.modular.wechat.cache; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; @Component public class TokenCache { private static LoadingCache<String,String> loadingCache = CacheBuilder .newBuilder().initialCapacity(100).maximumSize(100) .expireAfterWrite(7000, TimeUnit.SECONDS) .build(new CacheLoader<String, String>() { @Override public String load(String key) throws Exception { return null; } }); public static void setKey(String key,String value){ loadingCache.put(key, value); } public static String getValue(String key){ String value = null; try{ value = loadingCache.get(key); if(value == null){ return null; } return value; }catch (Exception e){ return null; } } }
上一篇:
通过多线程提高代码的执行效率例子