JVM级缓存本地缓存Caffeine

news/2024/5/30 3:19:22/文章来源:https://blog.csdn.net/qq_42872034/article/details/136618473

JVM级缓存本地缓存Caffeine和Guava Cache

  • 前言
  • 一、创建缓存的代码逻辑
  • 二、Caffeine的优化方面
    • 淘汰算法W-TinyLFU
  • 三、Caffeine的业务使用
  • 总结


前言

最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux…等等,会持续更新。

一、创建缓存的代码逻辑

  • Caffeine:
public LoadingCache<String, User> createUserCache() {return Caffeine.newBuilder().initialCapacity(1000) // 指定初始容量.maximumSize(10000L) // 指定最大容量.expireAfterWrite(30L, TimeUnit.MINUTES)  // 指定写入30分钟后过期.refreshAfterWrite(1L, TimeUnit.MINUTES) // 指定每隔1分钟刷新下数据内容.recordStats() // 开启缓存操作数据统计.build(key -> userDao.getUser(key)); // 构建CacheLoader加载类型的缓存对象
}
  • Guava Cache:
public LoadingCache<String, User> createUserCache() {return CacheBuilder.newBuilder().initialCapacity(1000) // 指定初始容量.maximumSize(10000L) // 指定最大容量.expireAfterWrite(30L, TimeUnit.MINUTES)  // 指定写入30分钟后过期.concurrencyLevel(8) // 指定并发量.recordStats() // 开启缓存操作数据统计.build((CacheLoader<String, User>) key -> userDao.getUser(key)); // 构建CacheLoader加载类型的缓存对象
}

Caffeine在Guava Cache的基础上做了改良和优化, 比如Caffeine创建对象时不支持使用concurrencyLevel来指定并发量,因为改进了并发控制机制。

二、Caffeine的优化方面

  • 1、底层数据结构的优化
    Caffeine是借助JDK8对ConcurrentHashMap,底层由数组+链表+红黑树,提升了Hash冲突时的查询效率,以及并发场景下的处理性能。
  • 2、数据淘汰策略的优化
    通过使用改良后的W-TinyLFU算法,提供了更佳的热点数据留存效果,提供了近乎完美的热点数据命中率,以及更低消耗的过程维护。

淘汰算法W-TinyLFU

常规的缓存淘汰算法一般采用LRU或者LFU,但是这些算法在实际缓存场景中都会存在一些弊端:

淘汰算法说明
LRU最近最久未使用策略,保留最近被访问到的数据,而淘汰最久没有被访问的数据。如果遇到偶尔的批量刷数据场景,很容易将其他缓存内容都挤出内存,带来缓存击穿的风险。
LFU最近少频率策略,这种根据访问次数进行淘汰,相比而言内存中存储的热点数据命中率会更高些,缺点就是需要维护独立字段用来记录每个元素的访问次数,占用内存空间。

Caffeine在LFU算法基础上引入一个基于LRU的Window Cache,这个新的算法叫就叫做W-TinyLFU,它有效的解决了LRU以及LFU存在的弊端,为Caffeine提供了大部分场景下近乎完美的命中率表现。

三、Caffeine的业务使用

  • 1、依赖引入
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.1</version>
</dependency>
  • 2、支持同步缓存与异步缓存
    Caffeine支持创建Cache与AsyncCache两种不同类型,而如果指定了CacheLoader的时候,又可以细分出LoadingCache子类型与AsyncLoadingCache子类型。

1)同步缓存

public static void main(String[] args) throws Exception {LoadingCache<String, String> loadingCache = buildLoadingCache();loadingCache.put("key1", "value1");String value = loadingCache.get("key1");System.out.println(value);
}

2)异步缓存

public static void main(String[] args) throws Exception {AsyncLoadingCache<String, String> asyncLoadingCache = buildAsyncLoadingCache();// 写入缓存记录(value值为异步获取)asyncLoadingCache.put("key1", CompletableFuture.supplyAsync(() -> "value1"));// 异步方式获取缓存值CompletableFuture<String> completableFuture = asyncLoadingCache.get("key1");String value = completableFuture.join();System.out.println(value);
}

总结

都已经看到这里啦,赶紧收藏起来,祝您工作顺心,生活愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1007688.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++的语法

可能需要用到存储各种数据类型&#xff08;比如字符型、宽字符型、整型、浮点型、双浮点型、布尔型等&#xff09; 下表显示了各种变量类型在内存中存储值时需要占用的内存&#xff0c;以及该类型的变量所能存储的最大值和最小值。 注意&#xff1a;不同系统会有所差异 #inc…

【阅读论文】智能数据可视分析技术综述

智能数据可视分析技术综述 文章结构 中文引用格式: 骆昱宇, 秦雪迪, 谢宇鹏, 李国良. 智能数据可视分析技术综述. 软件学报, 2024, 35(1): 356–404. http://www.jos.org.cn/1000-9825/6911.htm

智能物流新纪元:分布式I/O模块重塑仓储自动化

随着工业4.0概念的深入人心&#xff0c;物流行业正在经历前所未有的变革。在这个过程中&#xff0c;物流企业必须积极走向工业自动化、智能化&#xff0c;进而提高物流效率&#xff0c;降低物流成本&#xff0c;以便更好地满足客户和市场的需求。智能物流、仓库自动化已然是趋势…

C++ 改造红黑树,封装map和set

C 改造红黑树,封装map和set 一.前言:已经实现好了的红黑树二.简化STL库里面对于map和set的封装1.STL库中红黑树的简化代码2.STL库中set的简化代码3.STL库中map的简化代码4.封装map和set的第一步5.红黑树第一个模板参数的价值6.红黑树节点的定义 三.仿函数1.解除仿函数的误解2.仿…

devops-git【部署及配置】

1、安装Git Linux做为服务器端系统&#xff0c;Windows作为客户端系统&#xff0c;分别安装Git&#xff1a; 【服务器端】 输入git --version 若出现 -bash:git:command not found则需要安装git&#xff1b;服务器端&#xff1a;输入yum -y install git安装完后&#xff0c;…

【Datawhale组队学习:Sora原理与技术实战】训练一个 sora 模型的准备工作,video caption 和算力评估

训练 Sora 模型 在 Sora 的技术报告中&#xff0c;Sora 使用视频压缩网络将各种大小的视频压缩为潜在空间中的时空 patches sequence&#xff0c;然后使用 Diffusion Transformer 进行去噪&#xff0c;最后解码生成视频。 Open-Sora 在下图中总结了 Sora 可能使用的训练流程。…

mac删除带锁标识的app

一 、我们这里要删除FortiClient.app 带锁 常规方式删除不掉带锁的 app【如下图】 二、删除命令&#xff0c;依次执行即可。 /bin/ls -dleO /Applications/FortiClient.app sudo /usr/bin/chflags -R noschg /Applications/FortiClient.app /bin/ls -dleO /Applications/Forti…

【idea】正则表达式去除项目中的各种注释

【ctrlshiftr】 整个项目全局选择正则表达式Regex 【ctrlr】当前页面 分别输入以下命令 ^\s*\n #去除空行 ^\s*\n# 去除 <!--xxx--> 注释 <!--.*?--># 删除 java 注释 // xxx //[\s\S]*?\n# 删除 java 注释 /* */ /\*{1,2}[\s\S]*?\*/替换全部 Replace all 为…

Arcgis新建位置分配求解最佳商店位置

背景 借用Arcgis帮助文档中的说明:在本练习中,您将为连锁零售店选择可以获得最大业务量的商店位置。主要目标是要将商店定位在人口集中地区附近,因为这种区域对商店的需求量较大。设立这一目标的前提是假设人们往往更多光顾附近的商店,而对于距离较远的商店则较少光顾。您…

网络编程:TCP和UDP

一、通信模式 1.1 套接字socket 1.网络通信通过套接字进行数据传输 2.socket是一个函数&#xff0c;为通信创建一个端点&#xff0c;并返回该端点的文件描述符 3.套接字本身是一个文件描述符&#xff0c;对应的是一个特殊的文件&#xff0c;该文件描述符维护了两个缓冲区&a…

让el-input与其他组件能够显示在同一行

让el-input与其他组件能够显示在同一行 说明&#xff1a;由于el-input标签使用会默认占满一行&#xff0c;所以在某些需要多个展示一行的时候不适用&#xff0c;因此需要能够跟其他组件显示在同一行。 效果&#xff1a; 1、el-input标签内使用css属性inline 111<el-inp…

智慧未来,构建智慧校园业务架构的探索与实践

随着科技的不断发展&#xff0c;智慧校园作为教育信息化的重要组成部分&#xff0c;正在逐步改变传统教育管理模式&#xff0c;为学校带来更高效、便捷的管理服务。本文将深入探讨智慧校园业务架构设计的理念、核心功能和应用场景&#xff0c;助力读者了解如何构建智慧校园&…

STM32利用标准库控制定时器3复用端口PB4输出PWM波形

这节也是接着上节来演示的&#xff0c;上节写的是TIM2的CH1输出PWM波形&#xff0c;这次来学习一下TIM3的端口复用方法来输出PWM&#xff0c;来看看端口引脚图&#xff1a;正常情况下TIM3的CH1通道的PWM输出引脚为PA6&#xff0c;现在我不想用这个端口输出了&#xff0c;我想换…

【Redis】Redis常用命令之Hash

1.hset&#xff1a;设置hash中指定的字段&#xff08;field&#xff09;的值&#xff08;value&#xff09;。 HSET key field value [field value ...]时间复杂度&#xff1a;插⼊⼀组field为O(1),插⼊N组field为O(N)。 返回值&#xff1a;添加的字段的个数。 2.hget&#xf…

【AI+CAD】(二)LLM和VLM生成结构化数据结构(PPT/CAD/DXF)

当前LLM和VLM在PPT生成任务上已经小有成效,如ChatPPT。 @TOC 1. PPT-LLM LLM根据用户的instruction生成规范的绘制ppt的API语句:即使是最强的GPT-4 + CoT也只能达到20-30%的内容准确度。 LLM输入:User_instruction(当前+过去)、PPT_content、PPT_reader_API。其中 PPT_rea…

ChatGPT赋能遥感研究:精准分析处理遥感影像数据,推动科研新突破

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能在解…

苍穹外卖问题记录(持续更新)

Day01_3.2.4前后端联调 1. 前端无法登录 &#xff08;1&#xff09;确保nginx服务器已经启动 &#xff08;2&#xff09;查看自己数据库的用户名和密码是否和老师的一样&#xff0c;不一样的话需要在application-dev.yml文件中把老师的用户名密码修改成自己的 老师的用户名…

中间件漏洞(redis)

目录 1.Redis服务器被挖矿案例 2.redis常见用途 3.redis环境配置 4.redis的持久化机制 5.redis动态修改配置 6.webshell提权案例 7.定时任务bash反弹连接提权案例 8.SSH Key提权案例 9.redis安全加固分析 1.Redis服务器被挖矿案例 我没有体验过&#xff0c;那就看看别…

linux环境基础开发工具1(vim 、 yum)

目录 前言 Linux编辑器-vim使用 Linux 软件包管理器 yum 前言 集成开发环境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09;是用于提供程序开发环境的应用程序&#xff0c;一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码…

verilog 从入门到看得懂---verilog 介绍

verilog介绍 Verilog HDL 是一种硬件描述语言&#xff0c;HDL是 hardware description language发缩写。可以用于数字电子下系统的设计。通俗点说就是在设计数字芯片或着使用cpld 或者fpga的时候用到&#xff0c;比如在设计电路的时候&#xff0c;如果要试一下一个计数功能&am…