Redis vs MongoDB:内存字典与文档库对决
Redis
目录
1. 本质
2. 最常干的事
3. 数据类型(5+1)
4. 一秒上手
5. 为什么用 Redis 而不用 map
6. 集群与高可用
一句话速记
把数据放在内存里的超高速“字典”服务器,支持持久化、发布订阅、分布式锁,常当缓存、计数器、消息队列用。
1. 本质
-
内存数据库(键值对),读写亚毫秒级。
-
单线程网络模型,没有并发锁竞争,快且简单。
-
支持 持久化(RDB/AOF),断电不丢数据。
2. 最常干的事
| 场景 | Redis 命令示例 | 说明 |
|---|---|---|
| 缓存 | SET user:123 '{"name":"sunan"}' EX 600 | 10 分钟过期 |
| 计数器 | INCR page:view:home | 原子 +1 |
| 分布式锁 | SET lock:pay EX 30 NX | 30 秒自动释放 |
| 消息队列 | LPUSH task:q 1 2 3 / BRPOP task:q 0 | 列表阻塞弹出 |
| 排行榜 | ZADD rank 100 sunan 90 tom | 有序集合 |
3. 数据类型(5+1)
-
String 字符串
-
List 双端队列
-
Set 唯一集合
-
Sorted Set 带分数排行榜
-
Hash 对象表
-
Bitmap/HyperLogLog/Stream 扩展类型
4. 一秒上手
docker run -d -p 6379:6379 redis:7-alpine
redis-cli
> SET site redis
> GET site
"redis"
5. 为什么用 Redis 而不用 map
| map (内存) | Redis |
|---|---|
| 进程内 | 进程外/网络 |
| 重启即失 | 可持久化 |
| 单机 | 分布式集群 |
| 无锁 | 内置锁/原子指令 |
6. 集群与高可用
-
主从复制:一主多从,读写分离。
-
Sentinel:自动故障转移。
-
Redis Cluster:数据分片,横向扩展。
一句话速记
Redis = 远程内存字典 + 持久化 + 发布订阅 + 分布式锁,命令简单,性能爆炸,是后端缓存与实时计数的首选。
二、mongoDB
用“类 JSON”文档存数据的超灵活数据库,不需要提前设计表结构,适合需求变化快、字段不定、要横向扩展的现代应用。
1. 本质
-
文档型数据库(BSON,二进制 JSON)
-
无模式(Schema-less):同一集合里字段可以不同
-
支持索引、事务、聚合、分布式集群
2. 跟 MySQL 的直观对比
| MySQL | MongoDB |
|---|---|
| 表 table | 集合 collection |
| 行 row | 文档 document |
| 列 column | 字段 field |
| 先建表结构 | 随时加字段 |
| SQL | JSON 风格的查询 |
3. 一秒上手
docker run -d -p 27017:27017 mongo:7-jammy
mongosh
> use shop
> db.products.insertOne({name:"iPhone", price:5999, spec:{ram:"8G"}})
> db.products.find({price:{$gte:5000}})
4. 最常干的事
| 场景 | 示例 |
|---|---|
| 用户资料 | 字段随时扩展(头像、第三方账号、会员等级) |
| 日志/事件 | 不同日志字段不一样,直接塞 |
| 内容管理 | 文章、评论、标签嵌套在一个文档 |
| 实时分析 | 聚合框架一条语句分组、过滤、统计 |
5. 优势
-
敏捷:需求变→直接改字段,无需
ALTER TABLE -
嵌套:一条文档里嵌套数组、子文档,一次取出
-
水平扩展:内置分片,海量数据加机器即可
-
生态:Change Stream、GridFS 存大文件、Atlas 云服务
6. 什么时候不用
-
强事务、多表关联复杂(MySQL 更成熟)
-
固定字段、字段极少变化(MySQL 更省空间)
-
高度一致性银行核心帐(MySQL + 事务)
一句话速记
MongoDB = 文档版数据库,像 JSON 一样存数据,随加字段、易扩展,适合产品迭代快、字段不定、海量文档的现代应用。
