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相关推荐

  1. Caffeine Cache~高性能 Java 本地缓存之王

    前面刚说到Guava Cache,他的优点是封装了get,put操作:提供线程安全的缓存操作:提供过期策略:提供回收策略:缓存监控.当缓存的数据超过最大值时,使用LRU算法替换.这一篇我们将要谈到一个 ...

  2. 浅入浅出Caffeine cache

    背景 公司项目中有用到caffeine cache 所以来了解一下. 本地缓存也就是我们适用内存缓存一些热点数据,使应用程序的程序处理的更加的快.以及保护我们的一些有磁盘/网络IO操作的函数/方法,以 ...

  3. Caffeine Cache和Ehcache3.x 进程缓存性能比较

    Spring默认提供的:ConcurrentMapCache.使用它的原因是它是spring-context内置的,无需额外导包就能使用,超好用的 但在实际开发过程中,Spring内建提供的实现显然是 ...

  4. 玩转Spring Cache --- 整合进程缓存之王Caffeine Cache和Ehcache3.x【享学Spring】

    每篇一句 人到中年就是一部西游记:悟空的压力,八戒的身材,沙僧的发型,唐僧的唠叨 前言 前面文章大篇幅详细讲解了Spring Cache缓存抽象.三大缓存注解的工作原理等等.若是细心的小伙伴会发现:讲 ...

  5. Caffeine cache实现本地缓存(简单又清楚)

    Caffeine cache实现本地缓存题 缓存填充策略  手动加载  介绍:  使用方式:  同步加载  介绍:  使用方式:  异步加载  介绍:   注意: 异步和同步使用方式相似, 这里的话主 ...

  6. 一头扎进caffeine cache的大坑

    一头扎进caffeine cache的大坑 caffeine号称性能做好的本地cache,最近想实践一下学的东西,写个小demo,就用caffeine作为本地缓存缓存一下用户的token,然后配置大概 ...

  7. Caffeine Cache 简单示例

    Caffeine Cache 简单示例 如下 POM依赖 <?xml version="1.0" encoding="UTF-8"?> <pr ...

  8. 本地缓存框架:Caffeine Cache

    1. Caffine Cache 在算法上的优点-W-TinyLFU 说到优化,Caffine Cache到底优化了什么呢?我们刚提到过LRU,常见的缓存淘汰算法还有FIFO,LFU: 1.FIFO: ...

  9. 本地缓存—Caffeine Cache

    文章目录 缓存淘汰策略 FIFO 优点 局限性 LRU 优点 局限性 LFU 优点 局限性 W-TinyLFU 维护频率 CountMin Sketch 支持随时间变化的访问模式-分段LRU(SLRU ...

  10. 缓存之王Caffeine Cache,性能比Guava更强,命中率更高!

    点击上方"服务端思维",选择"设为星标" 回复"669"获取独家整理的精选资料集 回复"加群"加入全国服务端高端社群「后 ...

最新文章

  1. (14)某工业生产部门根据国家计划的安排, 拟将某种高效率的5台机器,分配给所属的3个工厂A,B,C,各工厂在获得这种机器后,可以为国家盈利的情况如表4-10所示。
  2. php 上传 类 代码,php 文件上传类代码
  3. 转:[大数据竞赛]协同过滤在这个问题上是否work
  4. Java将视频转为缩略图--ffmpeg
  5. 简述enumerate函数
  6. 5 万条微信语音升入太空;阿里京东否认停止社招;雷军开怼华为 | 极客头条...
  7. 过来人经验告诉你,如何从小菜B晋升为月薪过万的软件测试工程师?
  8. 计算机基础知识教程函数,EXCEL函数教程_电脑基础知识_IT计算机_专业资料.ppt
  9. 1995-2020年省级地级市环境污染数据集 三废排放、废气烟粉尘废水固体废物排放、空气质量AQI、空气污染物浓度PM2.5、环境投资保护治理数据
  10. 对称加密算法(DES、3DES、AES)
  11. 物联网+安防在智慧社区建设中的发展与深度应用
  12. linux tc 限制带宽,使用TC 对LINUX服务器网卡进行带宽限制的办法
  13. Docker 三剑客之 Compose
  14. 知足知不足 有为有不为
  15. docker实践(2)常用命令和DockerFile详解
  16. 追们算法----奶牛和草丛
  17. 怎么下载老版本android,剪映旧版下载
  18. gwu计算机硕士排名,美国乔治华盛顿大学计算机专业排名 研究方向有哪些
  19. 双11买的开发板,仪器,学电子的男生被优惠哭了。
  20. oracle被锁常用查询语句

热门文章

  1. 中文短文本的实体链指
  2. NRF52832----按键使用
  3. 轨迹预处理(停留点检测)
  4. ESLint vs Prettier
  5. moment获取2周后日期
  6. inflate()引发NullPointerException
  7. 【MySQL 数据的操作二】
  8. phpstorm 插件等功能
  9. STM8S 独立看门狗配置及使用
  10. sublime3调试Python