灵魂拷问:面试官问你“用过什么数据库”,你回答“MySQL”。他又问“那你们项目里Redis用来干嘛?”,你支支吾吾说“存……存东西?”。
恭喜你,今天这篇就是来给你“撑场面”的。
今天咱们换个姿势。
假如数据就是餐厅里的食材,那这哥仨就是厨房里各司其职的“三大战神”。读完这篇,你不仅知道它们怎么用,更知道它们为什么而活。
(把文末我整理的那张XMind全景图打开,边看边吃,效果翻倍!)
第一回合:MySQL —— 那个“重度强迫症”的财务总管
比喻定位:餐厅里拿着计算器、一丝不苟的财务总监。
核心标签:关系型、二维表、ACID(强一致性)、磁盘存储。
MySQL 是关系型数据库的“扛把子”。它最大的特点就是“规矩大”。
你要存数据?先建表(Schema)。字段叫什么名?是整数还是字符串?长度多少?要不要默认值?必须提前设计好,差一个字节都不让存。
它的生存法则(ACID):
原子性(A):要么全做,要么全不做(比如转账,你转100块,系统扣了你钱,对方没到账?MySQL绝不答应,它会回滚)。
隔离性(I):多人同时操作不打架。
持久性(D):存进硬盘里,断电了也不怕。
什么时候请它出山?
银行转账、订单系统、用户信息——任何丢了钱或数据会引发“血案”的核心业务。
需要多张表关联查询(Join)的复杂报表。
入门三连(必会SQL):
sql
-- 查:看菜单 SELECT * FROM dishes WHERE price < 50; -- 增:加新菜 INSERT INTO dishes (name, price) VALUES ('佛跳墙', 999); -- 改:菜价上涨 UPDATE dishes SET price = price + 10 WHERE name = '红烧肉'; -- 删:下架(谨慎操作!) DELETE FROM dishes WHERE name = '黑暗料理';第二回合:MongoDB —— 那个“随性自由”的仓库管理员
比喻定位:不管大件小件、方不方正,直接往货架上扔的仓库小哥。
核心标签:非关系型(NoSQL)、文档型(BSON/JSON)、无模式、分布式。
如果你受不了MySQL的“古板”,MongoDB绝对是你的“梦中情库”。
它不需要先建表,你想存什么就存什么。一条记录叫文档(Document),长得和 JSON 一模一样。
比如:用户信息突然加了个“头像字段”,MySQL要改表结构烦死,MongoDB直接存就行,老数据没有这个字段就是null,丝毫不影响。
它的生存法则:
无模式(Schema-less):同一个集合里,A记录有3个字段,B记录有10个字段,完全OK。
横向扩展:数据太多?加机器就行了,天生适合大数据和物联网。
什么时候请它出山?
日志系统(字段天天变)。
电商商品详情页(不同品类商品参数完全不同)。
内容管理系统(CMS),迭代极快的创业初期项目。
入门三连(Mongo Shell语法):
javascript
// 查:找价格小于50的(是不是很像JSON?) db.dishes.find({ price: { $lt: 50 } }); // 增:加新菜(直接插对象) db.dishes.insertOne({ name: "佛跳墙", price: 999, ingredients: ["鲍鱼", "海参"] }); // 改:涨价($set 是更新特定字段) db.dishes.updateOne({ name: "红烧肉" }, { $set: { price: 110 } }); // 删:下架 db.dishes.deleteOne({ name: "黑暗料理" });第三回合:Redis —— 那个“脑子超快”的传菜员
比喻定位:端着菜在厨房和餐桌之间光速奔跑的传菜员。
核心标签:键值对(Key-Value)、内存存储、闪电速度、缓存之王。
前面两位兄弟都是“老实人”,数据老老实实躺在硬盘上(读写慢,但安全)。
Redis 是个“疯子”,它把数据全部放在内存(RAM)里,读写速度能达到每秒10万+次,快得离谱!但代价是,断电可能丢数据(除非你开启持久化备份)。
它的杀手锏:不只是存字符串!
String(字符串):存短信验证码、用户Token。
Hash(哈希):存购物车信息(用户ID -> 商品ID + 数量)。
List(列表):做消息队列(先进先出)。
Set(集合):做抽奖、共同好友(去重)。
ZSet(有序集合):做实时排行榜(比如王者荣耀巅峰赛排名)!
什么时候请它出山?
缓存:查MySQL之前先问Redis有没有,有就直接返回,给MySQL降降压。
分布式锁:防止高并发下商品超卖。
Session共享:集群环境下,多台服务器共享用户登录状态。
入门三连(Redis命令):
bash
# 存(Key-Value) SET user:1001 '{"name":"张三"}' # 取 GET user:1001 # 排行榜神操作(ZSET) ZADD ranking 1000 "玩家A" # 添加分数 ZREVRANGE ranking 0 10 # 取出前10名第四回合:终极拷问!我到底该怎么选?(面试必答)
很多新手在架构设计时,拿着锤子看什么都像钉子。记住下面这张表,面试官当场给你竖大拇指:
| 维度 | MySQL (财务总监) | MongoDB (仓库小哥) | Redis (传菜员) |
|---|---|---|---|
| 存储介质 | 硬盘(SSD/HDD) | 硬盘 + 内存 | 纯内存(纯爷们不存硬盘) |
| 数据结构 | 严格的二维表(行+列) | 灵活的JSON文档 | 键值对 + 5大特殊结构 |
| 事务支持 | 强事务(ACID) | 支持多文档事务(较弱) | 支持简单事务(乐观锁) |
| 查询速度 | 较慢(毫秒级) | 中等(毫秒级) | 极快(微秒/纳秒级) |
| 扩展性 | 垂直扩展为主(分库分表难) | 天生水平扩展(分片集群) | 主从 + 集群(哨兵模式) |
| 最适合 | 金融、ERP、订单 | 日志、CMS、物联网 | 缓存、排行榜、消息队列 |
现实中的标准组合拳(大厂标配):
MySQL(主数据源) + Redis(高性能缓存) + MongoDB(非结构化日志/用户行为)
—— 各司其职,完美配合!
第五站:实战!一条数据从请求到返回,它们怎么配合?
假设你打开抖音,刷到了“小姐姐跳舞”的视频:
Redis先上:APP请求视频信息,先查Redis缓存。如果有(缓存命中),光速返回,MySQL直接休息。
MySQL兜底:如果Redis里没有(缓存穿透/未命中),请求去MySQL里把视频作者、标题、点赞数这些“硬数据”查出来。
MongoDB助攻:这条视频下的“用户评论流”或者“操作日志”(结构变化大),直接异步丢给MongoDB存储,方便运营后台做大数据分析。
Redis再写回:MySQL查出来的结果,立刻写入Redis并设置过期时间(比如1小时),下次再有人看,直接从第1步走,瞬间响应!
写在最后:别再死记硬背命令了!
数据库的本质,就是数据的存放与检索。
数据重要且要算账?找 MySQL。
数据多变且量大?找 MongoDB。
数据要快且临时?找 Redis。
只要你搞懂了它们各自的性格(存储结构)和生存环境(应用场景),命令只是“语法糖”,用时查一下就完事了。
学习路线图建议:
装环境:本地装个 MySQL(学SQL),再装个 Redis(敲
SET/GET)。做项目:把个人博客的“文章表”放MySQL,“访问量排行榜”放Redis。
去看源码:去看看SpringBoot怎么用
@Cacheable注解整合Redis,这才是现代开发的常态。
【独家福利 · XMind 三库知识体系全景图】
文章看完,是不是觉得信息量有点大?别担心,我把MySQL索引原理、MongoDB复制集、Redis持久化策略(RDB/AOF)等所有深水区知识点,全部浓缩在了一张高清XMind思维导图里。
(建议把这张图设置成电脑/手机壁纸,遇到不懂的直接看图索引。毕竟,站在“上帝视角”学技术,才是最高效的降维打击!
如果这篇让你彻底搞懂了这哥仨的区别,请务必给我一个【赞】和【收藏】,让更多在迷茫中的小伙伴看到!
评论区聊聊:你生产环境中最依赖哪个数据库?有没有因为选错型而半夜起床删过库?(讲出你的故事,让大家高兴高兴 😂)
关注我,下期预告:《Docker 入门:一键部署你的MySQL+Redis,告别“我本地明明能跑”》!