Caffeine Cache
1. 前言
互联网软件神速发展,用户的体验度是判断一个软件好坏的重要原因,所以缓存就是必不可少的一个神器。在多线程高并发场景中往往是离不开cache的,需要根据不同的应用场景来需要选择不同的cache,比如分布式缓存如redis、memcached,还有本地(进程内)缓存如ehcache、GuavaCache、Caffeine。
说起Guava Cache,很多人都不会陌生,它是Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略。由于Guava的大量使用,Guava Cache也得到了大量的应用。但是,Guava Cache的性能一定是最好的吗?也许,曾经,它的性能是非常不错的。但所谓长江后浪推前浪,总会有更加优秀的技术出现。今天,我就来介绍一个比Guava Cache性能更高的缓存框架:Caffeine。
2. 比较
Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略。
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。
Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中将取代,基于LRU算法实现,支持多种缓存过期策略。
2.1 官方性能比较
场景1:8个线程读,100%的读操作
场景二:6个线程读,2个线程写,也就是75%的读操作,25%的写操作
场景三:8个线程写,100%的写操作
可以清楚的看到Caffeine效率明显的高于其他缓存。
3. 如何使用
3.1手动加载(Manual)
public static void main(String[] args) {Cache<String, String> manualCache = Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.MILLISECONDS) //设置过期时间.maximumSize(100) //设置最大缓存个数.build();String key = "name";// 根据key查询一个缓存,如果没有返回NULLString value = manualCache.getIfPresent(key);System.out.println("key "+ value); //key null// 将一个值放入缓存,如果以前有值就覆盖以前的值manualCache.put(key,"reed");String value1 = manualCache.getIfPresent(key);System.out.println("key1 "+value1); //key1 reed// 删除一个缓存manualCache.invalidate(key);String value2 = manualCache.getIfPresent(key);System.out.println("key2 "+value2); //key2 null// 根据Key查询一个缓存,如果没有调用createExpensiveGraph方法,并将返回值保存到缓存。String value3 =manualCache.get(key,k->"fan");System.out.println("key3 "+value3); //key3 fanString value4 = manualCache.get(key,k->"reed");System.out.println("key4 "+value4); //key4 fan}
3.2同步加载(Loading)
@Testpublic void test(){LoadingCache<String, String> loadingCache = Caffeine.newBuilder().maximumSize(10_000).expireAfterWrite(10, TimeUnit.MINUTES).build(key -> getName(key));List<String> keys = new ArrayList<>();keys.add("reed");keys.add("fan");Map<String,String> map = loadingCache.getAll(keys);for(Map.Entry<String,String> m:map.entrySet()){System.out.println("key:" + m.getKey() + " value:" + m.getValue());/*key:reed value:reedkey:fan value:fan*/}}private String getName(String str){return str;}
3.3异步加载(Asynchronously Loading)
@Testpublic void test() throws Exception {AsyncLoadingCache<String, String> asyncLoadingCache = Caffeine.newBuilder().maximumSize(10_000).expireAfterWrite(10, TimeUnit.MINUTES).buildAsync(key -> getName(key));List<String> keys = new ArrayList<>();keys.add("reed");keys.add("fan");CompletableFuture<Map<String, String>> names = asyncLoadingCache.getAll(keys);Map<String, String> map = names.get();for (Map.Entry<String, String> m : map.entrySet()) {System.out.println("key:" + m.getKey() + " value:" + m.getValue());/*key:reed value:reedkey:fan value:fan*/}}private String getName(String str) {return str;}
Caffeine Cache相关推荐
- Caffeine Cache~高性能 Java 本地缓存之王
前面刚说到Guava Cache,他的优点是封装了get,put操作:提供线程安全的缓存操作:提供过期策略:提供回收策略:缓存监控.当缓存的数据超过最大值时,使用LRU算法替换.这一篇我们将要谈到一个 ...
- 浅入浅出Caffeine cache
背景 公司项目中有用到caffeine cache 所以来了解一下. 本地缓存也就是我们适用内存缓存一些热点数据,使应用程序的程序处理的更加的快.以及保护我们的一些有磁盘/网络IO操作的函数/方法,以 ...
- Caffeine Cache和Ehcache3.x 进程缓存性能比较
Spring默认提供的:ConcurrentMapCache.使用它的原因是它是spring-context内置的,无需额外导包就能使用,超好用的 但在实际开发过程中,Spring内建提供的实现显然是 ...
- 玩转Spring Cache --- 整合进程缓存之王Caffeine Cache和Ehcache3.x【享学Spring】
每篇一句 人到中年就是一部西游记:悟空的压力,八戒的身材,沙僧的发型,唐僧的唠叨 前言 前面文章大篇幅详细讲解了Spring Cache缓存抽象.三大缓存注解的工作原理等等.若是细心的小伙伴会发现:讲 ...
- Caffeine cache实现本地缓存(简单又清楚)
Caffeine cache实现本地缓存题 缓存填充策略 手动加载 介绍: 使用方式: 同步加载 介绍: 使用方式: 异步加载 介绍: 注意: 异步和同步使用方式相似, 这里的话主 ...
- 一头扎进caffeine cache的大坑
一头扎进caffeine cache的大坑 caffeine号称性能做好的本地cache,最近想实践一下学的东西,写个小demo,就用caffeine作为本地缓存缓存一下用户的token,然后配置大概 ...
- Caffeine Cache 简单示例
Caffeine Cache 简单示例 如下 POM依赖 <?xml version="1.0" encoding="UTF-8"?> <pr ...
- 本地缓存框架:Caffeine Cache
1. Caffine Cache 在算法上的优点-W-TinyLFU 说到优化,Caffine Cache到底优化了什么呢?我们刚提到过LRU,常见的缓存淘汰算法还有FIFO,LFU: 1.FIFO: ...
- 本地缓存—Caffeine Cache
文章目录 缓存淘汰策略 FIFO 优点 局限性 LRU 优点 局限性 LFU 优点 局限性 W-TinyLFU 维护频率 CountMin Sketch 支持随时间变化的访问模式-分段LRU(SLRU ...
- 缓存之王Caffeine Cache,性能比Guava更强,命中率更高!
点击上方"服务端思维",选择"设为星标" 回复"669"获取独家整理的精选资料集 回复"加群"加入全国服务端高端社群「后 ...
最新文章
- (14)某工业生产部门根据国家计划的安排, 拟将某种高效率的5台机器,分配给所属的3个工厂A,B,C,各工厂在获得这种机器后,可以为国家盈利的情况如表4-10所示。
- php 上传 类 代码,php 文件上传类代码
- 转:[大数据竞赛]协同过滤在这个问题上是否work
- Java将视频转为缩略图--ffmpeg
- 简述enumerate函数
- 5 万条微信语音升入太空;阿里京东否认停止社招;雷军开怼华为 | 极客头条...
- 过来人经验告诉你,如何从小菜B晋升为月薪过万的软件测试工程师?
- 计算机基础知识教程函数,EXCEL函数教程_电脑基础知识_IT计算机_专业资料.ppt
- 1995-2020年省级地级市环境污染数据集 三废排放、废气烟粉尘废水固体废物排放、空气质量AQI、空气污染物浓度PM2.5、环境投资保护治理数据
- 对称加密算法(DES、3DES、AES)
- 物联网+安防在智慧社区建设中的发展与深度应用
- linux tc 限制带宽,使用TC 对LINUX服务器网卡进行带宽限制的办法
- Docker 三剑客之 Compose
- 知足知不足 有为有不为
- docker实践(2)常用命令和DockerFile详解
- 追们算法----奶牛和草丛
- 怎么下载老版本android,剪映旧版下载
- gwu计算机硕士排名,美国乔治华盛顿大学计算机专业排名 研究方向有哪些
- 双11买的开发板,仪器,学电子的男生被优惠哭了。
- oracle被锁常用查询语句