MySQL,Redis,MongoDB的不同使用场景

77 Lv2

MySQL(关系型数据库)

场景:用户注册、登录与文章管理

需求

  • 需要持久化存储用户资料(用户名、密码、邮箱、注册时间等)。
  • 支持复杂查询(如“查找某用户的所有文章并按时间排序”)。
  • 需要事务保证数据一致性(如用户注册时同时写入用户表和权限表)。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- 用户表(users)
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password_hash VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 文章表(posts)
CREATE TABLE posts (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
title VARCHAR(200) NOT NULL,
content TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);

-- 查询用户及其最新文章
SELECT users.username, posts.title, posts.created_at
FROM users
JOIN posts ON users.id = posts.user_id
WHERE users.id = 123
ORDER BY posts.created_at DESC;

优势

  • 结构化数据存储,支持复杂 SQL 查询。

  • ACID 事务保证数据一致性(如转账、订单支付)。

  • 适合长期存储核心业务数据(用户、订单、商品等)。

Redis(键值对数据库)

场景:用户会话缓存与热门文章排行榜

需求

  • 快速读写用户会话信息(如登录状态)。

  • 实时统计热门文章点击量并生成排行榜。

  • 缓存用户个人资料,减轻 MySQL 压力。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 缓存用户会话(过期时间 30 分钟)
import redis
r = redis.Redis()

# 用户登录成功后缓存会话
user_id = 123
session_token = "abc123xyz"
r.set(f"session:{session_token}", user_id, ex=1800)

# 读取会话
current_user = r.get(f"session:{session_token}")

# 缓存用户个人资料(JSON 格式)
user_profile = {"id": 123, "username": "alice", "email": "alice@example.com"}
r.set(f"user_profile:{user_id}", json.dumps(user_profile))

# 文章点击量实时统计(使用有序集合)
r.zincrby("article_clicks", 1, "article:456") # 文章 456 点击量 +1

# 获取点击量 Top 10 文章
top_articles = r.zrevrange("article_clicks", 0, 9, withscores=True)

优势

  • 内存存储,读写性能极高(每秒数十万次操作)。

  • 支持丰富的数据结构(字符串、哈希、有序集合等)。

  • 适合临时数据(会话)、实时统计、分布式锁等场景。

MongoDB(文档数据库)

场景:实时聊天消息存储

需求

  • 存储用户之间的实时聊天消息(文本、图片、表情等)。

  • 消息格式灵活(可能包含动态字段,如消息类型、已读状态、撤回状态)。

  • 快速插入和按时间范围查询历史消息。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# MongoDB 文档结构(无需预定义 Schema)
{
"_id": ObjectId("6123456789abcdef01234567"),
"sender_id": 123,
"receiver_id": 456,
"content": "明天一起吃饭吗?",
"type": "text", # 消息类型:text/image/emoji
"timestamp": ISODate("2023-10-05T14:23:45Z"),
"read_status": False, # 是否已读
"metadata": { # 动态扩展字段
"image_url": "https://example.com/photo.jpg",
"width": 800,
"height": 600
}
}

# 查询用户 123 和 456 的最近 20 条消息
db.messages.find({
"$or": [
{"sender_id": 123, "receiver_id": 456},
{"sender_id": 456, "receiver_id": 123}
]
}).sort({"timestamp": -1}).limit(20)

优势

  • 文档模型灵活,支持动态字段和嵌套结构。

  • 水平扩展能力强,适合海量数据存储(如日志、IoT 数据)。

  • 高吞吐量写入,适合实时消息、评论、日志等场景。

总结

数据库类型 优势 适用场景
MySQL 结构化数据存储、支持复杂 SQL 查询、事务 长期存储核心业务数据:用户资料、订单、文章
Redis 内存存储、读写性能极高 快速读写用户会话信息、实时统计热门文章、缓存用户个人资料
MongoDB 文档模型灵活、支持动态字段和嵌套结构、水平扩展、高吞吐 实时聊天消息存储、实时日志存储

为什么不用Redis存储所有实时消息?
因为Redis虽然快,但数据持久化和存储量可能不如MongoDB合适。
为什么不用MySQL存储消息?
因为消息结构可能复杂,频繁的插入和查询在关系型数据库中可能效率不高。

  • 标题: MySQL,Redis,MongoDB的不同使用场景
  • 作者: 77
  • 创建于 : 2025-02-06 18:29:04
  • 更新于 : 2025-02-06 18:43:50
  • 链接: https://www.jiaheqi.cloud/2025/02/06/MySQL-Redis-MongoDB的不同使用场景/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论