加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MySQL:缓存算什么东西?!

发布时间:2018-11-08 18:21:47 所属栏目:编程 来源:码农翻身刘欣
导读:十年前,我们照旧一个企业内部的应用,用户不多,数据也不多。 Tomcat一天也处理赏罚不了几多哀求,闲得无聊的时辰只能和我谈天,这是没有步伐的工作,由于整个体系只有我们两个: 没错,我就是台甫鼎鼎的MySQL ,我和Tomcat位于差异的呆板上,每次通讯都是一
副问题[/!--empirenews.page--]

十年前,我们照旧一个企业内部的应用,用户不多,数据也不多。

Tomcat一天也处理赏罚不了几多哀求,闲得无聊的时辰只能和我谈天,这是没有步伐的工作,由于整个体系只有我们两个:

MySQL:缓存算什么对象?!

没错,我就是台甫鼎鼎的MySQL ,我和Tomcat位于差异的呆板上,每次通讯都是一次收集的哀求。

这样的环境一连了三年,我们俩把话都将近说尽了的时辰,人类终于送来了一个新家伙:缓存。

从外表看来,这个缓存就是一个Map罢了, 生涯的都是一些(key,value)这样的对象。

从内部看,他还真是个Map,是谁人叫做张大胖的人类写的、一个线程安详的、可以设定逾期时刻的Map。

Tomcat和我都有点瞧不上他,认为他其实是简略,乃至难以成为一个独立的组件。

更让Tomcat不爽的是,这个简略的家伙竟然和本身一路,共享JVM历程。

MySQL:缓存算什么对象?!

逐步地工作产生了变革,张大胖改变了措施逻辑:在之前,用户的哀求发到Tomcat这里,假如必要会见数据库的数据, Tomcat直接就把SQL语句扔给我来执行。

此刻, 先要到谁人Map,不,是缓存中查一下,看看有没有相干数据,假若有,直接就返回了,基础不消和我打交道; 假如缓存中没有,那才发出SQL查询,而且把缓存也给添补上,这样下次就不消会见数据库了。

Tomcat成天缓和存打交道,聊得热火朝天。 我调查了几天,终于大白这小子把我这个好基友给丢弃了。

Tomcat自得地对我说: “这缓存和我在一个历程中,会见起来速率快得很,立即就能返回数据,那边像你MySQL,逐步悠悠地执行半天?! ”

说完他又做了一个总结:历程内挪用就是好啊。

着实吧,缓存这小子的本质我比谁都清晰,我内部就有缓存啊,就是为了停止频仍地会见硬盘, 各人操作的都是措施的局部性道理嘛,有什么隐秘的?!

我耐性冬眠,守候机遇,筹备一举把这个不知好歹的Map干掉。

从历程内到历程外

过了几个月,张大胖把体系的架构做了进级,为了应对高并发的会见,他用一个nginx来搞负载平衡,分发用户的哀求,在后头搞了许多Tomcat和许多历程内的缓存,我们的体系酿成了这个样子:

MySQL:缓存算什么对象?!

我一看就意识到我的机遇来了:这缓存之间很轻易呈现纷歧致啊。

好比: 用户的哀求在JVM 1 中举办处理赏罚,MySQL做了更新,JVM 1中相干的缓存也做了更新可能被删除, 然则JVM 2和JVM 3中缓存的数据照旧旧的啊。

不出我的所料,数据纷歧致的题目很是严峻,用户频仍诉苦,缓存这小子这下要垮台了!

然则缓存还想垂危挣扎,他说:”可以这样嘛,假如一个JVM中的缓存产生了变革,就关照其他JVM。”

MySQL:缓存算什么对象?!

然则关照总会有耽误,假如JVM 1还没来得及关照JVM 2和JVM 3, 而用户的哀求已经在这两台呆板上开始处理赏罚了,数据纷歧致照旧存在。

出格是各个JVM之间必要往返交互,缓存的更新必要你关照我,我关照你,贫困得要死。

Tomcat出了一个馊主意:“别让缓存相互更新,让缓存按时从MySQL哪里更新!”

MySQL:缓存算什么对象?!

然则既然是按时更新,那缓存中的数据和我这里在某些时刻段内照旧会呈现纷歧致。

除非数据的变革频率极低,不然这险些是个无解的题目。

终于,张大胖如我所愿, 把历程内缓存给删除了!

我整规划好好跟Tomcat叙叙旧(这么多Tomcat啊!), 然则第二天他便弄来了一个新的家伙:Redis,照旧缓存!

和之间那简略的Map对比,Redis然则强盛得太多太多了,这个缓存独自攻克了一台呆板,让几个Tomcat都可以共享会见。

换句话说,缓存从历程内搬到了历程外!

MySQL:缓存算什么对象?!

我对Redis说:“你小子也必要收集才气会见了,和我差不多,有存在的须要吗?”

Redis说:“虽然有了,固然都是收集会见,可是我这里全部的数据可都在内存中啊,会见起来照旧比你快。”

我认可,他说的是对的。

数据纷歧致

此日晚上,会见量溘然间出格的大,是平常的百倍,不,千倍。 据Redis说,这是张大胖那家伙在搞压力测试了。

压力测试事后,一地鸡毛。 一盘货就发明,Redis的数据和我的数据居然发明白纷歧致。

Redis傻眼了,这是怎么回事?数据纷歧致,人类必定以我MySQL的数据库数据为准啊。

Tomcat提醒Redis:“预计是高并发惹的祸,我们看看是怎么更新数据的。”

Redis说:“简朴啊,先更新MySQL,然后更新我的数据。”

MySQL:缓存算什么对象?!

Tomcat说:“这是两步操纵,假若有两个线程都在这么干,就出题目了! 好比MySQL的有个值是100,此刻线程1想把它改成200, 线程2想把它改成300。”

MySQL:缓存算什么对象?!

Redis说:“看来这里有个大裂痕啊,那怎么办?”

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读