Caffeine--实现进程缓存

本地进程缓存特点


缓存在日常开发中起着至关重要的作用, 由于存储在内存中, 数据的读取速度非常快,能大量减少对数据库的访问,减少数据库的压力.

缓存分为两类:

  • 分布式缓存, 例如Redis:
    • 优点: 存储容量大, 可靠性更好, 可以在集群间共享
    • 缺点: 访问缓存存在网络开销
    • 场景: 缓存数据量较大, 可靠性要求较高, 需要在集群间共享
  • 进程本地缓存, 例如HashMap, GuavaCache:
    • 优点: 读取本地内存, 没有网络开销, 速度更快
    • 缺点: 存储容量有限, 可靠性较低, 无法共享
    • 场景: 性能要求较高, 缓存数据量较小

github: https://github.com/ben-manes/caffeine

引入依赖


		<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId></dependency>

入门案例


	@Testvoid name() {Cache<String, String> cache = Caffeine.newBuilder().build();String before = cache.getIfPresent("gf");cache.get("gf", key -> {   return "zhangmengdie"; });String after = cache.getIfPresent("gf");System.out.println("before = " + before);System.out.println("after = " + after);}

输出结果:
在这里插入图片描述
cache.get("gf", key -> { return "zhangmengdie"; });会先去缓存里面查,没有查到,会执行后面的Function,
然后自动添加到缓存里

缓存驱逐策略


  • 基于容量: 设置缓存的数量上限
Cache<String, String> cache = Caffeine.newBuilder().maximumSize(100).build();
  • 基于时间: 设置缓存的有效时间
Cache<String, String> cache = Caffeine.newBuilder().expireAfterWrite(Duration.ofSeconds(10L)).build();
  • 基于引用: 设置缓存为软引用或弱引用, 利用GC来回收缓存数据 (性能较差,不建议使用)

总结:

在默认情况下,当一个缓存元素过期的时候, Caffeine不会立即将其清理和驱逐. 而是在一次读或写操作后,
或者在空闲时间完成对失效数据的驱逐

	@Testvoid name() throws InterruptedException {Cache<String, String> cache = Caffeine.newBuilder().maximumSize(1L).build();cache.put("memo1", "zhangmengdie");cache.put("memo2", "jiacaimin");String memo1Before = cache.getIfPresent("memo1");String memo2Before = cache.getIfPresent("memo2");System.out.println("memo1Before = " + memo1Before);System.out.println("memo2Before = " + memo2Before);Thread.sleep(10L);String memo1After = cache.getIfPresent("memo1");String memo2After = cache.getIfPresent("memo2");System.out.println("memo1After = " + memo1After);System.out.println("memo2After = " + memo2After);}

输出结果:
在这里插入图片描述
可以看到设置大小为1, 第一次取到了失效的数据, 休眠10ms后,取到为空,可见不是立即清除

example


@Configuration
public class CaffeienConfig {@Beanpublic Cache<Long, Person> personCache(){return Caffeine.newBuilder().initialCapacity(100).maximumSize(10_000L).build();}}
@RestController
public class PersonController {@Autowiredprivate PersonService personService;@Autowiredprivate Cache<Long, Person> personCache;@GetMapping("/{id}")public Person queryById(@PathVariable("id") Long id){return personCache.get(id, key -> personService.query(key));}}

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

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

相关文章

c++: 引用能否替代指针? 详解引用与指针的区别.

文章目录 前言1. 引用和指针的最大区别:引用不能改变指向2. 引用和指针在底层上面是一样的3. 引用和指针在sizeof面前大小不同4. 有多级指针,没有多级引用5.引用是引用的实体,指针会向后偏移同一个类型的大小 总结 前言 新来的小伙伴如果不知道引用是什么?可以看我的上一篇文…

el-table-column嵌套el-form-item不能进行校验问题解决

项目为vue3elementPlus开发的项目 业务要求&#xff1a;table表格展示数据&#xff0c;其中有一行是ip地址可展示可修改&#xff0c;此处要求增加自定义校验规则 先看一下效果&#xff1a; 此处先描述一下&#xff0c;问题出在了哪里&#xff0c;我将el-table的data,使用一个…

日常004:对文件、目录拥有rwx权限后可以做什么?

日常004&#xff1a;对文件、目录拥有rwx权限后可以做什么&#xff1f; ‍ 1.rwx权限针对文件的内容&#xff0c;而非文件本身。 2.文件夹是特殊的文件&#xff0c;它的内容就是ls -a​的所有文件和文件夹 r 读取目录w 添加、删除、重命名文件x 进入目录 ‍ 删除文件使用的是所…

connection SQLException, url:jdbc ,errorCode 0, state 08S01

connection SQLException, url: jdbc:mysql://localhost:3306/itcast_health?useUnicodetrue&characterEncodingutf-8, errorCode 0, state 08S01 添加&#xff1a;&useSSLfalse 添加前 添加后&#xff1a; 查询数据库正常

7.5寸WIFI电子桌牌 PW75R_DM

产品型号 PW75R_DM 尺寸(mm) 190*152*45mm 显示技术 电子墨水屏双面显示 显示区域(mm) 163.2(H) * 97.92(V) 分辨率(像素) 800*480 外观颜色 银灰色 显示颜色 黑/白/红 视觉角度 180 工作温度 0 - 40℃ 电池容量 2000mAh 供电方式 锂电池供电&#xff08;…

张驰咨询 - 推动新质生产力,新材料行业定制管理咨询解决方案

在这个快速变革的时代&#xff0c;张驰咨询携手各行业领军企业&#xff0c;共同打造新质生产力的未来。我们深入理解每个行业的发展现状及特点&#xff0c;洞察企业面临的痛点&#xff0c;用精准咨询方案&#xff0c;为新能源汽车、光伏产业、机器人、高端装备以及新材料和电子…

链表中的经典问题——回文链表

回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 题解一&#xff1a; 要判断一个单链表是否为回文链表&#xff0c;可以使用双指针和逆序链表的方法。具体步骤如下&…

AIGC笔记--Maya提取和修改FBX动作文件

目录 1--Maya数据解析 2--FBX SDK导出6D数据 3--6D数据映射和Maya可视化 完整项目代码&#xff1a;Data-Processing/FBX_SDK_Maya 1--Maya数据解析 在软件Maya中直接拖入FBX文件&#xff0c;可以播放和查看人体各个骨骼关节点的数据&#xff1a; 对于上图来说&#xff0c;…

基于yolov5的草莓成熟度检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的草莓成熟度检测系统&#xff0c;系统既能够实现图像检测&#xff0c;也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的草莓成熟度系统是在pytorch框架下实现的&#xff0c;这是一个完整的项目…

【机器学习】包裹式特征选择之拉斯维加斯包装器(LVW)算法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

C#,T检验(T -Test)的算法与源代码

1 T-Test 学生t检验(英语:Students t-test)是指虚无假设成立时的任一检定统计有学生t-分布的统计假说检定,属于母数统计。学生t检验常作为检验一群来自正态分配母体的独立样本之期望值的是否为某一实数,或是二群来自正态分配母体的独立样本之期望值的差是否为某一实数。举…

C语言从入门到熟悉------第二阶段

printf的用法 printf的格式有四种&#xff1a; &#xff08;1&#xff09;printf("字符串\n"); 其中\n表示换行的意思。其中n是“new line”的缩写&#xff0c;即“新的一行”。此外需要注意的是&#xff0c;printf中的双引号和后面的分号必须是在英文输入法下。双引…

六西格玛倡导者培训怎么选?这份攻略送给你

作为企业的中坚力量&#xff0c;成为一名合格的六西格玛倡导者&#xff0c;不仅是对个人能力的极大提升&#xff0c;更是对企业持续发展的重要保障。那么&#xff0c;如何选择适合自己的六西格玛倡导者培训课程呢&#xff1f;天行健Six Sigma咨询公司有建议如下&#xff1a; 一…

Java开发从入门到精通(一):Java的项目案例

Java大数据开发和安全开发 Java 案例练习案例一:买飞机票案例二:开发验证码案例三:评委打分案例四:数字加密案例五:数组拷贝案例六: 抢红包案例七:找素数案例八:模拟双色球[拓展案例] Java 案例练习 案例一:买飞机票 分析: 方法是需要接收数据?需要接收机票原价、当前月份、舱…

学习大数据,所需要Java基础(9)

文章目录 网络编程实现简答客户端和服务器端的交互编写客户端编写服务端 文件上传文件上传客户端以及服务器端实现文件上传服务器端实现&#xff08;多线程&#xff09;文件上传服务器端&#xff08;连接池版本&#xff09;关闭资源工具类 BS架构服务器案例案例分析BS结构服务器…

​《中华活页文选(传统文化教学与研究)》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答&#xff1a; ​问&#xff1a;《中华活页文选(传统文化教学与研究)》是什么级别的期刊&#xff1f; 答&#xff1a;国家级&#xff1b;主管单位&#xff1a;中国出版传媒股份有限公司&#xff1b;主办单位&#xff1a;中华书局有限公司 问&#xff1a;《中华活页文…

程序人生——Java开发中通用的方法和准则,Java进阶知识汇总

目录 引出Java开发中通用的方法和准则建议1:不要在常量和变量中出现易混淆的字母建议2:莫让常量蜕变成变量建议3:三元操作符的类型务必一致建议4:避免带有变长参数的方法重载建议5:别让null值和空值威胁到变长方法建议6:覆写变长方法也循规蹈矩建议7:警惕自增的陷阱建议…

023—pandas 扩展逗号爆炸分隔字符串数据

需求&#xff1a; 将 c1 按逗号拆分&#xff0c;爆炸为一行一行数据&#xff0c;然后将 c1 后边的有逗号的扩展成行&#xff0c;没逗号的只写在第一行。 思路&#xff1a; 先将 DataFrame 中有逗号的值分拆转为列表&#xff0c;接下来我们对 c1 进行爆炸&#xff0c;就得到了…

Sora背后的技术《可控生成与文本到图像扩散模型》

在迅速发展的视觉生成领域中&#xff0c;扩散模型革命性地改变了景观&#xff0c;以其令人印象深刻的文本引导生成功能标志着能力的重大转变。然而&#xff0c;仅依赖文本来条件化这些模型并不能完全满足不同应用和场景的多样化和复杂需求。认识到这一不足&#xff0c;多项研究…

开源推荐榜【ScottPlot 一个免费的开源 .NET 绘图库,百万数据点毫秒级绘制效率】

ScottPlot 是一个用于 C# 的开源绘图库&#xff0c;旨在提供简单易用的绘图功能&#xff0c;特别适用于科学和工程应用。它基于 .NET 平台&#xff0c;可以在 Windows、Linux 和 macOS 等操作系统上使用。 ScottPlot 具有以下主要特点&#xff1a; 简单易用&#xff1a;ScottPl…