java caffeine_高性能Java缓存----Caffeine_孙彻斯特的博客-程序员秘密

技术标签: java caffeine  

简单介绍

Caffeine是新出现的一个高性能的Java缓存,有了它完全可以代替Guava Cache,来实现更加高效的缓存;Caffeine采用了W-TinyLFU回收策略,集合了LRU和LFU的优点,提供了一个最佳的命中率,在效率上可以秒杀Guava Cache,下面盗取一个来自网络的性能比较的截图:

30a847fe415453f1420d00861f0f6f61.png

如何使用

Caffeine使用非常简单,跟Guava Cache的API使用几乎一致,下面就话不多说直接,进入代码使用和学习中。

手动加载 import java.util.concurrent.TimeUnit; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; public class CaffeineManualLoadTest { public static void main(String[] args) { // 手动加载 Cache manualCache = Caffeine.newBuilder() .expireAfterWrite(5, TimeUnit.SECONDS) .build(); String key = "test1"; // 根据key查询一个缓存,如果没有则调用createTestValue方法将返回值写到缓存 // 如果createTestValue方法返回空,则get方法返回空 // 如果createTestValue方法抛出异常,则get方法返回异常 Object oj = manualCache.get(key, k -> createTestValue(k)); System.out.println("oj = " + oj); // 将一个值写入缓存,如果存在就会覆盖掉已经存在的值 manualCache.put(key, "hello world."); oj = manualCache.getIfPresent(key); System.out.println("oj = " + oj); // 删除一个缓存 manualCache.invalidate(key); oj = manualCache.getIfPresent(key); System.out.println("oj = " + oj); } private static Object createTestValue(String k) { return null; } }

同步加载 import java.util.concurrent.TimeUnit; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; public class CaffeineLoadingTest { public static void main(String[] args) { // 同步加载 LoadingCache loadingCache = Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.SECONDS) .build(key -> createTestValue(key)); String key = "test1"; // 在获取指定key的值的时候 // 如果没有获取到则通过在构建同步缓存的时候调用createTestValue方法写入方法值 Object oj = loadingCache.get(key); System.out.println("oj : " + oj); } private static Object createTestValue(String k) { return k; } }

异步加载 import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import com.github.benmanes.caffeine.cache.AsyncLoadingCache; import com.github.benmanes.caffeine.cache.Caffeine; public class CaffeineAsyncLoadTest { public static void main(String[] args) { // 异步加载 AsyncLoadingCache asyncLoadingCache = Caffeine.newBuilder() .expireAfterWrite(60, TimeUnit.SECONDS) .buildAsync(key -> createTestValue(key)); String key = "test1"; // 查询并且在指定的key不存在的时候,通过异步的方式来构建缓存,返回的是CompletableFuture CompletableFuture futrueOj = asyncLoadingCache.get(key); } private static Object createTestValue(String k) { return "jingjing say: hello world."; } }

驱逐策略

1.基于大小:Caffeine.maximumSize(long),Caffeine.maximumWeight(long);注意这两个不能同时使用。

2.基于时间:可以设置为基于秒,分等等时间策略。

3.基于引用:用到了Java中的强引用,软引用,弱引用的概念去实现的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_31979781/article/details/114110961

智能推荐

【HTML5】HTML5_d;\exam\ps_林家阿酒的博客-程序员秘密

HTML5新标签指定一个预先定义的输入控件选项列表定义了表单的密钥对生成器字段定义一个计算结果

【QCustomPlot】1.4 - 绘制动态曲线、波形图,隐藏曲线graph,鼠标移动拖动、滚轮缩放、点击选中_rpqueuedreplot_Mark_md的博客-程序员秘密

使用Q绘制动态曲线更多QCustomPlot控件的使用操作,会在本专栏的后续篇章介绍,一起学习进步。工程已同步至GitHub,欢迎下载学习。使用时记得遵循GPLv3哦。我的学习例程仓库,GitHub:QCustomPlot 学习例程下载鼠标缩放,左键拖动缩放,滚轮按鼠标位置整体缩放,右键移动加载/导出cvs文件专栏不错哦:https://www.cnblogs.com/swarmbees/category/908110.html...

Pro Micro_wh201906的博客-程序员秘密

选择这块Arduino板主要是因为它便宜(淘宝上20元左右搞定),引脚相对较多,体积小,而且其使用的处理器核心ATmega32U4(兼容Arduino Leonardo)可用于模拟HID设备,可以配合其它传感器模块做键鼠输入一、下载开发板定义先在Arduino IDE中,点击“文件”→“首选项”,在“附加开发板管理器网址”当中输入以下内容并保存https://raw.githubuser...

Spring Cloud 应用篇 之 Spring Cloud Sleuth + Zipkin(三)修改数据存储方式_zipkin.storage.type_qq_34412985的博客-程序员秘密

(一)简介默认情况下,Zipkin Server 会将跟踪信息存储在内存中,每次重启 Zipkin Server 都会使之前收集的跟踪信息丢失,并且当有大量跟踪信息时,内存存储也会造成性能瓶颈,所以通常我们都需要将跟踪信息存储到外部组件中,如 Mysql。由于Spring Boot 2.0 之后Zipkin 不再推荐我们来自定义 Server 端了,那么如何把 Zipkin Server 修改为 Mysql 存储功能呢?答案还是和集成 RabbitMQ 一样,在启动 zipkin.jar 的时候..

Amazon深度学习工程师总结的分类模型炼丹技巧总结_bn层的γ如何设置成0_春枫琰玉的博客-程序员秘密

论文名称:Bag of Tricks for Image Classification with Convolutional Neural Networks论文链接:https://arxiv.org/pdf/1812.01187.pdfhttps://arxiv.org/pdf/1812.01187.pdf很多时候,外界同学管深度学习算法工程师叫做调参工程师,简单直接的概括了深度学习工程师的...

随便推点

测试适合什么英语口音的软件,自学英语用哪个英语单词测试学习软件更好更方便?..._甜嗑儿的博客-程序员秘密

现在各类软件非常多,各有优势,小编为大家推荐几款。一、适合学生使用的1、英语四级单词英语四级单词app是一款百万大学生的首选背单词软件应用,一直稳居在英语四级app排行榜前列。其使用方便、体积小巧的记单词软件,通过真人语音、单词测试、拼写测试、阅读、真题等结合的方式,帮助您轻松背单词,让您轻轻松松过四级。2、击破英语单词击破英语单词(PKWord)是一款学习英语单词的软件,它根据学习英语单词的基本...

CSDN 打不开解决方案---关闭系统防火墙_土耳其的曼谷风的博客-程序员秘密

有那么一段时间,特别是做完系统以后,感觉打开有些网页就很快,有些半天加载不出来,加载就是无法打开...卒突然今天想起来是不是学校的专用网有问题ping了一下,很快的嘛( ′◔ ‸◔`)然后依次--->选择 windows 防火墙可以看到 墙墙墙墙----把开关关闭就好了..突然发现网速打开了新世界 Orz当然这只是无奈之举,渴望究极网速可以尝...

Java 7源码分析第2篇 - Java数值类型_iteye_19583的博客-程序员秘密

在Java中,能够表示数值的数据类型有6种,主要分为两类,一类是可以表示小数的float和double类型,另外一类就是只能表示整数类型的byte、short、int和long类型了。这些基本类型对应的封装类型都继承了Number类,Number.java类的源代码如下:public abstract class Number implements java.io.Serializable...

Level up!从流量经营到客户运营实战技术分享_weixin_33724570的博客-程序员秘密

本文将与大家分享淘宝客户运营平台——聚星台的技术架构,以及个性化访客运营算法技术和个性化营销算法技术,以及其中运用的深度学习和在线学习算法实践。直播视频:点此进入PDF下载:点此进入本次分享主要分为四个部分聚星台(客户运营平台)介绍个性化访客运营(千人千面)算法技术个性化营销算法技术总结背景介绍今年阿里巴巴有一个非...

JDK1.8源码笔记(3) StringBuilder&StringBuffer_create a copy, don't share the array_大吉大利,今晚AC的博客-程序员秘密

AbstractStringBuilder前言在讨论StringBuilder和StringBuffer之前,我们有必要先说一下AbstractStringBuilder。StringBuilder和StringBuffer都继承自AbstractStringBuilder,AbstractStringBuilder也定义了大量的方法和变量。A mutable sequence ...

python简易学习(一)_YouNgFreshq的博客-程序员秘密

本篇博客诞生于暑假,因为无聊的时候又不能一直玩,还不如学学编程,就当玩了呗。那就开始吧本次学习是看廖雪峰的文档进行学习,把一些学习到的点记录下来。直接运行py文件有同学问,能不能像.exe文件那样直接运行.py文件呢?在Windows上是不行的,但是,在Mac和Linux上是可以的,方法是在.py文件的第一行加上一个特殊的注释:#!/usr/bin/env python3print('...

推荐文章

热门文章

相关标签