网站首页 > java教程 正文
简介
guava是google的一个开源java框架,其github地址是 https://github.com/google/guava。guava工程包含了若干被Google的Java项目广泛依赖的核心库,例如:
- 集合 [collections]
- 缓存 [caching]
- 原生类型支持 [primitives support]
- 并发库 [concurrency libraries]
- 通用注解 [common annotations]
- 字符串处理 [string processing]
- I/O
所有这些工具每天都在被Google的工程师应用在产品服务中。 其中caching是常用的模块的之一
引入依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.1-jre</version>
</dependency>
使用示例
基本用法
@Component
public final class WsRoleCache {
private static Logger logger = LoggerFactory.getLogger(WsRoleCache.class);
private static AtomicBoolean isInited = new AtomicBoolean(false);
private static LoadingCache<String, List<WsRole>> cache;
private WsRoleCache() {
if (!isInited.get()) {
init();
}
}
private static void init() {
logger.info("---初始化WsRole");
cache = CacheBuilder.newBuilder().refreshAfterWrite(10, TimeUnit.MINUTES)
.build(new CacheLoader<String, List<WsRole>>() {
@Override
public List<WsRole> load(String key) throws Exception {
// 如果是第一次,调用load方法;如果是两次get时间在10分钟之间,就不会调用load
RoleManager service = SpringContextHolder.getBean("RoleManager");
logger.info("查询WsRole");
List<WsRole> list = service.getWsAll(key);
return list;
}
});
isInited.set(true);
}
public static List<WsRole> getWsAll(String key) {
try {
return cache.get(key);
} catch (Exception e) {
}
return null;
}
}
利用@Component让工程启动的时候初始化cache对象,重写构造函数并且设置为private是为了保证是单例的
核心方法
- refreshAfterWrite : 写入数据后多久过期,只阻塞当前数据加载线程,其他线程返回旧值
- expireAfterWrite : 写缓存后多久过期
- expireAfterAccess : 读写缓存后多久过期
- maximumSize : 设置缓存最大容量,超过之后就会按照LRU最近虽少使用算法来移除缓存项
异步刷新
抽象类CacheLoader是同步刷新的。
如果缓存到期了,有多个线程调用缓存,那么第一个调用的会阻塞住,其他的线程会直接返回已过期的缓存
如果想要让所有的线程都不阻塞,就要创建异步加载类
public abstract class RefreshAsyncCacheLoader<K, V> extends CacheLoader<K, V> {
private ExecutorService threadPool = Executors.newSingleThreadExecutor();
@Override
public ListenableFuture<V> reload(final K key, final V oldValue) throws Exception {
checkNotNull(key);
checkNotNull(oldValue);
//增加配置参数,控制是否异步加载;1-异步加载,0-同步加载
String async = PropertyConfigurer.getProperty("cache.refres.async");
if (StringUtils.equals(async,"1")){
ListenableFutureTask<V> task = ListenableFutureTask.create(new Callable<V>() {
public V call() {
try {
return load((K) key);
} catch (Exception e) {
}
return oldValue;
}
});
threadPool.execute(task);
return task;
}else{
return Futures.immediateFuture(load(key));
}
}
}
将CacheLoader替换成异步实现类RefreshAsyncCacheLoader
public static void init() {
logger.info("---初始化WsUserCache");
cache = CacheBuilder.newBuilder().refreshAfterWrite(10, TimeUnit.MINUTES)
.build(new RefreshAsyncCacheLoader<String, List<WsUser>>() {
@Override
public List<WsUser> load(String key) throws Exception {
UserManager service = SpringContextHolder.getBean("userManager");
logger.info("查询WsUser");
List<WsUser> list = service.getWsAll();
return list;
}
});
}
显示清除
缓存会自动过期,也可以手动让其过期,主要有以下方法:
- 个别清除:Cache.invalidate(key)
- 批量清除:Cache.invalidateAll(keys)
- 清除所有缓存项:Cache.invalidateAll()
总结
- guava cache是本地缓存,和redis、memcached等集中缓存不同,如果是集群环境,本地缓存有不同步的问题,如果对缓存同步时间要求不是太高,这完全不是问题
- 相比于redis等集中缓存,本地缓存性能更高;因为没有网络交互,直接内存读取
- guava cache使用简单、控制灵活
猜你喜欢
- 2024-10-25 Caffeine高性能本地缓存框架初探(caffeine缓存原理)
- 2024-10-25 Redis学习3——Redis应用之缓存(redis的缓存的使用方式)
- 2024-10-25 Java高级——缓存的使用场景(java缓存机制)
- 2024-10-25 java中常用的几种缓存类型介绍(java常用缓存技术)
- 2024-10-25 本地缓存之王caffeine#代码(本地缓存 js)
- 2024-10-25 skywalking agent 本地缓存队列参数设置
- 2024-10-25 史上最实用的:分布式缓存方案(分布式缓存设计方案)
- 2024-10-25 深究分布式缓存的九个点(分布式缓存技术有哪些)
- 2024-10-25 面试题之java缓存总结,从单机缓存到分布式缓存架构
- 2024-10-25 JVM级别的本地缓存框架Guava Cache:探寻实现细节与核心机制
你 发表评论:
欢迎- 最近发表
-
- pyinstaller打包python程序高级技巧
- 将python打包成exe的方式(python打包成exe的方法)
- Python打包:如何将 Flask 项目打包成exe程序
- py2exe实现python文件打包为.exe可执行程序(上篇)
- 如何将 Python 项目打包成 exe,另带卸载功能!
- Python打包成 exe,太大了该怎么解决?
- 可视化 Python 打包 exe,这个神器绝了!
- 案例详解pyinstaller将python程序打包为可执行文件exe
- Cocos 3.x 菜鸟一起玩:打包window程序
- 怎么把 Python + Flet 开发的程序,打包为 exe ?这个方法很简单!
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)