MySQL:缓存算什么东西?!
亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《MySQL:缓存算什么东西?!》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下MySQL、缓存、数据库,希望所有认真读完的童鞋们,都有实质性的提高。
十年前,我们还是一个企业内部的应用,用户不多,数据也不多。
Tomcat一天也处理不了多少请求,闲得无聊的时候只能和我聊天,这是没有办法的事情,因为整个系统只有我们两个:
没错,我就是大名鼎鼎的MySQL ,我和Tomcat位于不同的机器上,每次通信都是一次网络的请求。
这样的情况持续了三年,我们俩把话都快要说尽了的时候,人类终于送来了一个新家伙:缓存。
从外表看来,这个缓存就是一个Map而已, 保存的都是一些(key,value)这样的东西。
从内部看,他还真是个Map,是那个叫做张大胖的人类写的、一个线程安全的、可以设定过期时间的Map。
Tomcat和我都有点瞧不上他,觉得他实在是简陋,甚至难以成为一个独立的组件。
更让Tomcat不爽的是,这个简陋的家伙竟然和自己一起,共享JVM进程。
慢慢地事情发生了变化,张大胖改变了程序逻辑:在之前,用户的请求发到Tomcat这里,如果需要访问数据库的数据, Tomcat直接就把SQL语句扔给我来执行。
现在, 先要到那个Map,不,是缓存中查一下,看看有没有相关数据,如果有,直接就返回了,根本不用和我打交道; 如果缓存中没有,那才发出SQL查询,并且把缓存也给填充上,这样下次就不用访问数据库了。
Tomcat整天和缓存打交道,聊得热火朝天。 我观察了几天,终于明白这小子把我这个好基友给抛弃了。
Tomcat得意地对我说: “这缓存和我在一个进程中,访问起来速度快得很,立刻就能返回数据,哪里像你MySQL,慢慢悠悠地执行半天?! ”
说完他又做了一个总结:进程内调用就是好啊。
其实吧,缓存这小子的本质我比谁都清楚,我内部就有缓存啊,就是为了避免频繁地访问硬盘, 大家利用的都是程序的局部性原理嘛,有什么神秘的?!
我耐心蛰伏,等待机会,准备一举把这个不知好歹的Map干掉。
从进程内到进程外
过了几个月,张大胖把系统的架构做了升级,为了应对高并发的访问,他用一个nginx来搞负载均衡,分发用户的请求,在后面搞了很多Tomcat和很多进程内的缓存,我们的系统变成了这个样子:
我一看就意识到我的机会来了:这缓存之间很容易出现不一致啊。
比如: 用户的请求在JVM 1 中进行处理,MySQL做了更新,JVM 1中相关的缓存也做了更新或者被删除, 可是JVM 2和JVM 3中缓存的数据还是旧的啊。
不出我的所料,数据不一致的问题非常严重,用户频繁抱怨,缓存这小子这下要完蛋了!
可是缓存还想垂死挣扎,他说:”可以这样嘛,如果一个JVM中的缓存发生了变化,就通知其他JVM。”
可是通知总会有延迟,如果JVM 1还没来得及通知JVM 2和JVM 3, 而用户的请求已经在这两台机器上开始处理了,数据不一致还是存在。
特别是各个JVM之间需要来回交互,缓存的更新需要你通知我,我通知你,麻烦得要死。
Tomcat出了一个馊主意:“别让缓存互相更新,让缓存定时从MySQL那里更新!”
可是既然是定时更新,那缓存中的数据和我这里在某些时间段内还是会出现不一致。
除非数据的变化频率极低,否则这几乎是个无解的问题。
终于,张大胖如我所愿, 把进程内缓存给删除了!
我整打算好好跟Tomcat叙叙旧(这么多Tomcat啊!), 可是第二天他便弄来了一个新的家伙:Redis,还是缓存!
和之间那简陋的Map相比,Redis可是强大得太多太多了,这个缓存独自霸占了一台机器,让几个Tomcat都可以共享访问。
换句话说,缓存从进程内搬到了进程外!
我对Redis说:“你小子也需要网络才能访问了,和我差不多,有存在的必要吗?”
Redis说:“当然有了,虽然都是网络访问,但是我这里所有的数据可都在内存中啊,访问起来还是比你快。”
我承认,他说的是对的。
数据不一致
这天晚上,访问量突然间特别的大,是平时的百倍,不,千倍。 据Redis说,这是张大胖那家伙在搞压力测试了。
压力测试过后,一地鸡毛。 一盘点就发现,Redis的数据和我的数据居然发现了不一致。
Redis傻眼了,这是怎么回事?数据不一致,人类肯定以我MySQL的数据库数据为准啊。
Tomcat提示Redis:“估计是高并发惹的祸,我们看看是怎么更新数据的。”
Redis说:“简单啊,先更新MySQL,然后更新我的数据。”
Tomcat说:“这是两步操作,如果有两个线程都在这么干,就出问题了! 比如MySQL的有个值是100,现在线程1想把它改成200, 线程2想把它改成300。”
Redis说:“看来这里有个大漏洞啊,那怎么办?”
看着他们俩一筹莫展的样子,我忍不住说道:“这还不简单,当需要更新数据的时候,不要去更新缓存,把缓存中相关数据删除就行了。”
Redis说:“你这是官报私仇吧,把数据从我这里删除了,下次用户访问的时候没有,还得找你去要,对不对?”
我说:“是得找我要,但是能解决你的问题啊,两个线程同时写,不会出现数据库和缓存不一致啊。“
再说了,这其实不是我们能管的事情,咱们走着瞧,看看张大胖怎么做。”
第二天,张大胖果然按照我说的逻辑修改了程序,还美名其曰:Cache Aside Pattern。
虽然我一直想把缓存干掉,可是,几天后的经历却深刻地教育了我,缓存还是必不可少的......
(唉,再挖个坑,主题估计你也想到了,就是缓存穿透,击穿,雪崩......)
到这里,我们也就讲完了《MySQL:缓存算什么东西?!》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于mysql的知识点!

- 上一篇
- go语言指向数组的指针取值报错如何解决?

- 下一篇
- 请问golang如何导入自己的包?
-
- 怕孤单的墨镜
- 很有用,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢楼主分享技术文章!
- 2023-03-19 06:44:51
-
- 俭朴的小天鹅
- 这篇文章内容太及时了,太细致了,写的不错,码起来,关注大佬了!希望大佬能多写数据库相关的文章。
- 2023-02-26 20:20:16
-
- 数据库 · MySQL | 7分钟前 |
- MySQLcount优化技巧及性能提升方法
- 371浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQLUPDATE替换字段值方法详解
- 292浏览 收藏
-
- 数据库 · MySQL | 2小时前 |
- MySQL基础:增删改查全教程
- 356浏览 收藏
-
- 数据库 · MySQL | 3小时前 |
- MySQL建表语法详解与实例教程
- 498浏览 收藏
-
- 数据库 · MySQL | 5小时前 |
- MySQL中文界面设置方法详解
- 356浏览 收藏
-
- 数据库 · MySQL | 14小时前 |
- MySQL安装后如何启动和连接
- 233浏览 收藏
-
- 数据库 · MySQL | 16小时前 |
- MySQL中WHERE与HAVING的区别详解
- 259浏览 收藏
-
- 数据库 · MySQL | 18小时前 |
- MySQL数据备份方法与策略详解
- 112浏览 收藏
-
- 数据库 · MySQL | 20小时前 |
- MySQL中HAVING和WHERE的区别
- 363浏览 收藏
-
- 数据库 · MySQL | 20小时前 |
- MySQL数据归档方法与工具推荐
- 372浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL排序优化与性能提升技巧
- 236浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL缓存优化与参数调优技巧
- 107浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 86次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 81次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 94次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 87次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 87次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览
-
- mysql面试题
- 2023-01-17 157浏览
-
- MySQL数据表简单查询
- 2023-01-10 101浏览