当前位置: 首页 > 原理解释

java本地缓存原理-Java 本地缓存原理

大量人一到面试,听到“本地缓存”就脑补出一堆金灿灿的“预取器”、“多级缓存”、“内存带宽爆炸”之类的术语,结局自己拿到的代码却是一片雪花白。
实际上别整那些虚头巴脑的概念了,本地缓存的本质就两个好办的字:内存和工夫。 在 Java 里,本地缓存说白了就是把你想要的东西,先把它们塞进 JVM 堆里。堆是 JVM 的主战场,空间有限,故此我们得学会“省空间”。比方说,你刚写了一段代码,想查一下某个变量到底有没有被重新定义过,这时候你去查内存,得一个个字节一个个地扫,耗时就是秒数级。但要是直接去内存里找,万一那个线程正在其他地方执行别的逻辑呢?那你想找,还得等别的线程把数据装下来,那就更慢了。
这时候,本地缓存就登场了,它就像个私人储物柜,线程刚想拿东西,柜子里的数据立马就给你铺好了。 举个例子,想象你在做大规模的数据分析。你写了一个循环,要计算一亿个数字的平方。
要是你每次都去内存里算一遍,那执行工夫就是按亿来计算的了。
这时候,你先用代码把一亿个数字临时存进内存,算完再删掉。别看删了之后数据没了,但内存里的痕迹还在。下次再用这个变量,系统就能直接调用你存的数值,根本不用重新算。
这就是本地缓存最管用的地方:它不帮你算,它只帮你存。 那为啥要用缓存呢?出于内存就是个好用的工具,它随时有,随时能装,并且能装下比硬件更大的东西。本地缓存就利用了这一点。当线程请求数据时,本地缓存赶紧把数据“搬运”到内存池子里,这样一来,线程就能瞬间拿到想要的东西,不用再去网路上翻寻了,更不需求出于“找不到”而挂起等待了。 不过,这里有个坑得填到位。
要是内存不够用如何办?这时候我们得寻思分层。
比方说,把一些特别常用的数据先放本地缓存,像刚写代码查变量这种高频、短命的需求,直接塞进本地缓存里,这样响应速度最快。而那些数据,要是时常变,要么数据量特别大,就没必要塞进本地缓存了。
这时候,系统就会切换到二级缓存,比如数据库要么 Redis 这种。
要是数据不存有,就报错,不会让线程空转等待。 本地缓存里的数据,肯定不能随意乱存。你得记住两件事:一是生命周期,二是空间。生命周期就是它存有的时长,要是是“热数据”,比如刚写好的变量,可能只存有几毫秒,用完就直接清空;要是是“冷数据”,比如每天查一次的用户信息,那就得存有好几天,不然占着坑位也没用。
这时候就得看你的业务逻辑,要是数据不需求实时性,那就存着,用着;要是数据要实时,那就得寻思更新策略,比如用“失效工夫”管住,要么用“过期工夫”来清理。 还有空间难题。本地缓存是有上限的,受限于 JVM 的堆大小。
要是你存的数据越来越多,堆不够了,线程就可能出于找不到数据而卡死,就连抛出 OutOfMemoryError 的异常。
这时候,你就得想办法扩容,比如加更大的堆,要么引入外部中间件。
另外,如何选数据类型也挺关键。取用的数据类型,务必是 JVM 堆里能直接存的数据类型,比如根本类型、引用类型,要么是数组。
要是你存了个对象,那这个对象得能直接放进堆里,不然数据就跑到堆外去了,那本地缓存就失效了。 最终,还得提个“写”的难题。本地缓存有时候是为了读写的,有时候是为了只读的。读写性能差别挺大。
要是数据时常要更新,比如刚写好的变量,那就是一次性写,用完就扔,不用管它后续会不会被读取。
要是数据是只读的,那就更好办了,存进去就等着未来的读取,不需求额外的开销。 总的来说,本地缓存就是靠“内存”和“工夫”的博弈,把数据提前装好,让线程省得搬来搬去。它不是魔法,也不是啥复杂的架构,就是个好办的工具,用好它,能帮你在海量数据面前跑得飞快。
相关标签:

猜你喜欢

热门阅读

  • 赖柴尔定理-赖柴尔定理
  • 迪拜哪个国家的城市?-迪拜在哪国城市
  • 李毅吧番号及出处-李毅吧番号及出处
  • 贴春联的由来简介50字-春联由来简述
  • 思乡的名言和出处-思乡名言及出处

其他分站