Redis进阶 - JVM进程缓存
原文首更地址,阅读效果更佳!
Redis进阶 - JVM进程缓存 | CoderMast编程桅杆
https://www.codermast.com/database/redis/redis-advance-jvm-process-cache.html
传统缓存的问题
传统的缓存策略一般是请求到达 Tomcat 后,先查询 Redis ,如果未命中则查询数据库,存在下面的问题:
- 请求要经过 Tomcat 处理,Tomcat 的性能成为整个系统的瓶颈
- Redis 缓存失效时,会对数据库产生冲击

多级缓存方案
多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻 Tomcat 压力,提升服务性能:

#本地进程缓存
缓存在日常开发中起着至关重要的作用,由于是存储在内存汇总,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。我们把缓存分为两类:
-
分布式缓存:例如 Redis
- 优点:存储容量更大、可靠性更好、可以再集群间共享
- 缺点:访问缓存有网络开销
- 场景:缓存数据量较大、可靠性要求较高、需要在集群间共享
-
进程本地缓存:例如 HashMap、GuavaCache
- 优点:读取本地内存,没有网络开销,速度更快
- 缺点:存储容量有限、可靠性能较低、无法共享
- 场景:性能要求较高,缓存数据量较小
Caffeine 是一个基于 Java8 开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前 Spring 内部的缓存使用的就是 Caffeine。
Github 地址:https://github.com/ben-manes/caffeineopen in new window

#Caffeine
Caffeine 是一个基于 Java8 开发的提供了近乎最佳命中率的高性能的缓存库。
缓存和 ConcurrentMap 有点相似,但还是有所区别。最根本的区别是 ConcurrentMap 将会持有所有加入到缓存当中的元素,直到它们被从缓存当中手动移除。但是,Caffeine 的缓存 Cache 通常会被配置成自动驱逐缓存中元素,以限制其内存占用。在某些场景下,LoadingCache 和AsyncLoadingCache 因为其自动加载缓存的能力将会变得非常实用。
Caffeine 提供了灵活的构造器去创建一个拥有下列特性的缓存:
- 自动加载元素到缓存当中,异步加载的方式也可供选择
- 当达到最大容量的时候可以使用基于就近度和频率的算法进行基于容量的驱逐
- 将根据缓存中的元素上一次访问或者被修改的时间进行基于过期时间的驱逐
- 当向缓存中一个已经过时的元素进行访问的时候将会进行异步刷新
- key 将自动被弱引用所封装
- value 将自动被弱引用或者软引用所封装
- 驱逐(或移除)缓存中的元素时将会进行通知
- 写入传播到一个外部数据源当中
- 持续计算缓存的访问统计指标
为了提高集成度,扩展模块提供了 JSR-107 JCache 和 Guava 适配器。 JSR-107 规范了基于 Java 6 的 API,在牺牲了功能和性能的代价下使代码更加规范。
Guava 的 Cache 是 Caffeine 的原型库并且 Caffeine 提供了适配器以供简单的迁移策略。
原文地址
https://github.com/ben-manes/caffeine/wiki/Home-zh-CNopen in new window
#Caffeine示例
@Test
void testCaffeine(){// 1.创建缓存对象Cache<String,String> cache = Caffeine.newBuilder().build();// 2.存数据cache.put("username","codermast");// 3.1取数据,不存在则返回 NullString username = cache.getIfPresent("username");System.out.println("username = " + username);// 3.2取数据,不存在则从数据库查询String username2 = cache.get("username",key -> {// 这里写的是去数据库查询的业务逻辑// ...return "Hello World!";});System.out.println("username2 = " + username2);
}
#Caffeine缓存驱逐策略
Caffeine 提供了三种缓存驱逐策略:
- 基于容量:设置缓存的数量上限,使用 LRU 规则选择
// 创建缓存对象
Cache<String,String> cache = Caffeine.newBuilder().maximumSize(1) // 设置缓存大小上限为 1.build();
- 基于时间:设置缓存的有效时间
// 创建缓存对象
Cache<String,String> cache = Caffeine.newBuilder().expireAfterWrite(Duration.ofSeconds(10)) // 设置缓存有效期为 10 s,从最后一次写入操作开始计时.build();
- 基于引用:设置缓存为软引用或者弱引用,利用 GC 来回收缓存数据。性能较差,不建议使用。
在默认情况下,当一个缓存元素过期的时候,Caffeine 不会自动立即将其清理和驱逐。而是在一次读或者写操作后,或者在空闲时间完成对失效数据的驱逐。
注释
JVM 进程缓存和 Redis 缓存,本质上都是对数据的缓存,目的都是为了加速数据的读取。
相关文章:
Redis进阶 - JVM进程缓存
原文首更地址,阅读效果更佳! Redis进阶 - JVM进程缓存 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-advance-jvm-process-cache.html 传统缓存的问题 传统的缓存策略一般是请求到达 Tomcat 后,先查询 Redis &…...
SD-WAN带您告别高成本、单一功能和安全性差
现今,随着企业规模不断扩大和分散办公越来越普遍,企业对于网络的需求也变得越来越高。然而,传统的组网方式面临着很多的问题,比如:成本高、功能单一、安全性差等问题。 传统组网方式有哪些? 传统的组网方式…...
面试必备:揭秘ArrayList和LinkedList,区别、优缺点与使用场景
大家好,我是你们的小米!今天我要跟大家聊一个在面试中经常被问到的热门话题——ArrayList和LinkedList的区别、优缺点以及它们的使用场景。作为程序员,掌握这些知识点不仅可以在面试中脱颖而出,还能帮助我们更好地在项目中选择合适…...
【局部活动轮廓】使用水平集方法实现局部活动轮廓方法研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Git 同步远程新的同名分支
背景 因为远程分支的提交记录过多,导致本地的commit内容过大,会产生一些问题: 第一次拉取时间较长占用本地和远程的存储 原因 因为项目已有一些年头,若是每次文件提交比较大,那么占用空间就更大 解决方案 该方案…...
PingCode DevOps 团队:企业CICD流水线可能会遇到的问题及解法
CICD 流水线是指一系列自动化的构建、测试和部署步骤,用于将应用程序从开发到生产环境的过程。在 CICD 流水线中,每个步骤都是自动化的,并且在完成后会触发下一个步骤的执行。 CICD 的价值 CICD 流水线可以帮助团队更快地交付产品ÿ…...
【LeetCode题目详解】第九章 动态规划part01 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 (day38补)
本文章代码以c为例! 一、力扣第509题:斐波那契数 题目: 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:…...
图像处理 信号处理板 设计原理图:367-基于zynq XC7Z100 FMC接口通用计算平台
基于zynq XC7Z100 FMC接口通用计算平台 一、板卡概述 板卡由SoC XC7Z100-2FFG900I芯片来完成卡主控及数字信号处理,XC7Z100内部集成了两个ARM Cortex-A9核和一个kintex 7的FPGA,通过PL端FPGA扩展FMC、光纤、IO等接口,PS端ARM扩展网络、USB、R…...
PHP中header()的七种用法
我们在实际开发中经常使用header()实现一些功能,这篇文章介绍关于header()的7中用法,需要的伙伴的开参考一下。 PHP header()的7中用法: 1、跳转页面 可以使用header()实现跳转页面功能。 header(Location:.$url); // $url 跳转页面的地址…...
臻图信息以数字孪生技术推动智慧小区数字化建设
伴随着智慧城市建设进程的加速发展,加速传统小区的管理与服务向智能化升级转型。运用智慧化的管理和服务,利用信息技术和物联网等技术手段,将传统的居住区域与智能设备相结合,实现楼宇、社区设施、服务管理的数字化、网络化、智能…...
15.CSS发光按钮的悬停特效
效果 源码 <!DOCTYPE html> <html> <head><title>CSS Modern Button</title><link rel="stylesheet" type="text/css" href="style.css"> </head> <body><a href="#" style=&quo…...
MyBatis —— 动态SQL和缓存
前言 在上一篇文章中荔枝梳理了一些特殊的SQL查询和一对多、多对一的映射关系,而在这篇文章中荔枝将会梳理有关MyBatis动态SQL和MyBatis缓存的相关知识,同时也稍微了解了有关MyBatis中借助MAVEN中的插件管理来实现逆向工程。希望对需要的小伙伴有帮助哈哈…...
恒流电路的三种设计方案
作为硬件研发工程师相信对恒流电路不会陌生,本文介绍下三种恒流电路的原理图。 三极管恒流电路 三极管恒流电路 三极管的恒流电路,主要是利用Q2三极管的基级导通电压为0.6~0.7V这个特性;当Q2三极管导通,Q1三极管基级电压被拉低而…...
QT基础 关于QT延迟
目录 QT提供延时 1.自定义延时 2.使用QElapsedTimer 3.使用事件循环 4.跨平台延时 QT提供延时 这里提供四种方法: 1、多线程程序使用QThread::sleep()或者QThread::msleep()或QThread::usleep()或QThread::wait()进行延时处理。 Sleep不会释放对象锁&#x…...
LLM - LLaMA-2 获取文本向量并计算 Cos 相似度
目录 一.引言 二.获取文本向量 1.hidden_states 与 last_hidden_states ◆ hidden_states ◆ last_hidden_states 2.LLaMA-2 获取 hidden_states ◆ model config ◆ get Embedding 三.获取向量 Cos 相似度 1.向量选择 2.Cos 相似度 3.BERT-whitening 特征白化 …...
【创建型设计模式】C#设计模式之工厂模式,以及通过反射实现动态工厂。
题目如下: 假设你正在为一家汽车制造公司编写软件。公司生产多种类型的汽车,包括轿车、SUV和卡车。每种汽车都有不同的特点和功能。请设计一个工厂模式,用于创建不同类型的汽车对象。该工厂模式应具有以下要求:工厂类名为 CarFac…...
可拖拽编辑的流程图X6
先上图 //index.html,有时候可能加载失败,那就再找一个别的cdn 或者npm下载,如果npm下载, //那么需要全局引入或者局部引入,代码里面写法也会不同,详细的可以看示例<script src"https://cdn.jsdeli…...
神经网络与卷积神经网络
全连接神经网络 概念及应用场景 全连接神经网络是一种深度学习模型,也被称为多层感知机(MLP)。它由多个神经元组成的层级结构,每个神经元都与前一层的所有神经元相连,它们之间的连接权重是可训练的。每个神经元都计算…...
《Java极简设计模式》第05章:原型模式(Prototype)
作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 源码地址:https://github.com/binghe001/java-simple-design-patterns/tree/master/j…...
OceanBase 4.1解读:读写兼备的DBLink让数据共享“零距离”
梁长青,OceanBase 高级研发工程师,从事 SQL 执行引擎相关工作,目前主要负责 DBLink、单机引擎优化等方面工作。 沈大川,OceanBase 高级研发工程师,从事 SQL 执行引擎相关工作,曾参与 TPC-H 项目攻坚&#x…...
百度网盘高速下载神器:baidu-wangpan-parse全攻略,告别龟速下载!
百度网盘高速下载神器:baidu-wangpan-parse全攻略,告别龟速下载! 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘那令人抓狂…...
Tomcat DefaultServlet MIME类型处理缺陷导致信息泄露
1. 这个漏洞不是“能读文件”那么简单,而是Tomcat在特定配置下主动把不该暴露的内部状态当HTTP响应发出去了CVE-2024-21733这个编号刚出来时,我第一反应是又一个“目录遍历”或“文件读取”类的老套路。但真正花半天时间搭环境复现、抓包分析、翻Tomcat源…...
SpinalHDL流水线设计:从时序抽象到工程实践
1. 项目概述:从Verilog的“线”到SpinalHDL的“流”在数字电路设计里,时序逻辑的流水线(Pipeline)是个老生常谈但又至关重要的概念。无论是为了提升系统主频,还是为了平衡组合逻辑路径的延迟,我们总免不了要…...
Arty S7 FPGA开发板:从入门到进阶的硬件加速与嵌入式开发实战
1. 项目概述:为什么是Arty S7?如果你是一名嵌入式开发者、数字电路设计的学生,或者对硬件加速、实时信号处理感兴趣,那么“FPGA开发板”这个词对你来说一定不陌生。但面对市场上琳琅满目的开发板,从几百元到上万元不等…...
保姆级教程:用Ansys Zemax从零设计一个汽车HUD(附挡风玻璃反射优化技巧)
从零开始用Ansys Zemax设计汽车HUD:避坑指南与实战技巧 在汽车智能化浪潮中,抬头显示系统(HUD)正从高端车型的选配逐渐成为主流配置。对于光学工程师而言,掌握HUD设计能力已成为职业发展的关键技能。本文将带你从零开始…...
从Noise2Noise到Neighbor2Neighbor:图解自监督去噪的演进与核心‘采样’技巧
从Noise2Noise到Neighbor2Neighbor:自监督去噪技术的范式跃迁与工程实践 当你在昏暗环境下用手机拍摄一张照片时,那些恼人的彩色颗粒可能让你直接点击删除键。传统去噪方法需要大量"干净-噪声"图像对进行训练,而真实世界中获取完美…...
CANN/asc-devkit MakeNDLayout函数
MakeNDLayout 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.c…...
GitHub 被黑或因员工安装 Nx Console 恶意扩展引发,更多详情待调查
聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士专栏供应链安全数字化时代,软件无处不在。软件如同社会中的“虚拟人”,已经成为支撑社会正常运转的最基本元素之一,软件的安全性问题也正在成为当今社会的…...
解锁洛可可美学密码:用Midjourney V6实现蓬巴杜夫人级繁复纹样、柔光质感与粉金配色的5步精准控制法
更多请点击: https://intelliparadigm.com 第一章:洛可可美学的数字转译本质与Midjourney V6语义解码机制 洛可可美学以繁复卷曲的曲线、轻盈的不对称构图、粉金柔色调与自然母题(如贝壳、藤蔓、云朵)为标志,其核心并…...
RT-Trace升级:集成GDB Server与一键烧录,打造嵌入式开发调试平台
1. 项目概述:嵌入式开发的“瑞士军刀”再进化如果你是一名嵌入式开发者,最近可能被一个词刷屏了——RT-Trace。这已经不是它第一次带来惊喜了。最初,它以非侵入式的实时追踪和性能分析能力,在RT-Thread社区里掀起了一阵热潮&#…...
