一篇文章彻底搞懂 MySQL 和 Redis原理、区别、项目用法全解析建议收藏在现代后端开发中MySQL 和 Redis 是两种最常用的数据存储系统。很多开发者虽然会使用它们但对底层原理和适用场景的理解往往比较模糊。本文将从实战角度出发通过原理分析、对比表格和可运行的代码示例帮你彻底搞懂这两兄弟。## 一、MySQL 和 Redis 的核心原理### 1.1 MySQL磁盘上的关系型数据库MySQL 是基于磁盘存储的关系型数据库管理系统RDBMS。它使用表结构存储数据支持 ACID 事务原子性、一致性、隔离性、持久性。其核心原理如下-存储引擎最常用的是 InnoDB支持行级锁、外键和 MVCC多版本并发控制。-索引机制默认使用 B 树索引适合范围查询和排序。-持久化数据直接写入磁盘通过 redo log 和 binlog 保证数据安全。### 1.2 Redis内存中的键值数据库Redis 是基于内存的键值数据库所有数据读写都在内存中完成因此速度极快微秒级。它的核心原理包括-单线程模型Redis 6.x 之前使用单线程处理命令避免了锁竞争。-数据结构丰富支持字符串、哈希、列表、集合、有序集合等。-持久化机制通过 RDB快照和 AOF追加日志将内存数据持久化到磁盘。## 二、MySQL 和 Redis 的核心区别| 特性 | MySQL | Redis ||---------------------|--------------------------------|--------------------------------|| 存储位置 | 磁盘 | 内存主 磁盘持久化 || 数据模型 | 关系表结构化 | 键值对多种数据结构 || 查询语言 | SQL | 命令如 GET、SET 等 || 事务支持 | 完整 ACID | 有限的事务MULTI/EXEC || 读写速度 | 慢毫秒级受磁盘 I/O 限制 | 极快微秒级内存操作 || 数据容量 | 可支持 TB 级 | 受内存限制通常 GB 级 || 典型场景 | 核心业务数据存储 | 缓存、会话、排行榜、计数器 |一句话总结MySQL 负责“存得住、查得准”Redis 负责“快得飞起”。## 三、项目实战Python 代码演示下面通过两个完整的 Python 示例展示如何在项目中使用 MySQL 和 Redis 协同工作。### 3.1 示例1MySQL 存储用户核心数据本示例演示如何使用 MySQL 存储用户注册信息并进行查询。python# 文件名mysql_demo.py# 依赖安装pip install pymysqlimport pymysql# 连接 MySQL 数据库请根据实际情况修改主机、用户、密码connection pymysql.connect( hostlocalhost, userroot, passwordyour_password, databasetest_db, charsetutf8mb4, cursorclasspymysql.cursors.DictCursor)try: with connection.cursor() as cursor: # 创建用户表如果不存在 create_table_sql CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; cursor.execute(create_table_sql) print(✅ 用户表创建成功) # 插入一条用户记录 insert_sql INSERT INTO users (username, email) VALUES (%s, %s) cursor.execute(insert_sql, (zhangsan, zhangsanexample.com)) connection.commit() print(✅ 用户数据插入成功) # 查询用户 select_sql SELECT * FROM users WHERE username %s cursor.execute(select_sql, (zhangsan,)) user cursor.fetchone() print(f✅ 查询结果{user})finally: connection.close()运行结果示例✅ 用户表创建成功✅ 用户数据插入成功✅ 查询结果{id: 1, username: zhangsan, email: zhangsanexample.com, created_at: datetime.datetime(...)}### 3.2 示例2Redis 缓存用户热点数据在电商场景中用户最近浏览的商品列表适合用 Redis 缓存。本示例模拟缓存用户浏览记录。python# 文件名redis_demo.py# 依赖安装pip install redisimport redisimport json# 连接 Redis默认端口 6379r redis.Redis(hostlocalhost, port6379, decode_responsesTrue)def add_recently_viewed(user_id: int, product_id: int): 将商品 ID 添加到用户的最近浏览列表中。 - 使用 Redis 列表List存储最新浏览放在左侧 - 限制最多保留 10 条记录 key fuser:{user_id}:recently_viewed # 从左侧插入LIFO 风格最新在最前 r.lpush(key, product_id) # 修剪列表只保留前 10 个元素 r.ltrim(key, 0, 9) # 设置过期时间为 1 小时3600 秒 r.expire(key, 3600)def get_recently_viewed(user_id: int) - list: 获取用户最近浏览的商品列表从新到旧 key fuser:{user_id}:recently_viewed # 获取列表全部元素从索引 0 到 -1 return r.lrange(key, 0, -1)# 模拟用户浏览商品user_id 1001for pid in [101, 202, 303, 404]: add_recently_viewed(user_id, pid) print(f✅ 浏览商品 {pid} 已记录)# 获取并打印最近浏览记录recent get_recently_viewed(user_id)print(f✅ 用户 {user_id} 最近浏览的商品{recent})# 输出示例[404, 303, 202, 101]运行结果示例✅ 浏览商品 101 已记录✅ 浏览商品 202 已记录✅ 浏览商品 303 已记录✅ 浏览商品 404 已记录✅ 用户 1001 最近浏览的商品[404, 303, 202, 101]## 四、项目中的典型用法组合在实际项目中MySQL 和 Redis 经常配合使用各司其职| 场景 | MySQL 的职责 | Redis 的职责 ||---------------------|----------------------------------|----------------------------------|| 用户注册/登录 | 存储用户密码哈希、个人信息 | 缓存登录态Session/Token || 商品详情页 | 存储商品描述、价格、库存等 | 缓存热门商品详情减少数据库查询 || 计数器点赞/访问 | 最终数据落盘用于报表 | 实时计数INCR 命令 || 排行榜 | 存储历史排名数据 | 实时排序Sorted Set || 消息队列 | 不推荐用 MySQL 做队列效率低 | 使用 List 或 Stream 实现简单队列 |经典模式先查 Redis如果命中缓存命中则直接返回如果未命中则查询 MySQL并将结果写入 Redis同时设置过期时间。这就是缓存穿透保护的基本思路。## 五、总结-MySQL 是地基适合存储需要持久化、支持复杂查询、保证数据一致性的核心业务数据。它是“慢但可靠”的代表。-Redis 是加速器适合存储高频访问、对时效性要求高、数据结构简单的数据。它是“快但内存贵”的代表。-项目最佳实践不要试图用 MySQL 解决所有问题比如做实时排行榜会非常吃力也不要滥用 Redis 存所有数据内存成本高且无 SQL 查询能力。合理搭配才能打造高效、稳定的系统。希望这篇文章能帮你建立清晰的知识框架。如果你在实际项目中遇到过 MySQL 或 Redis 的坑欢迎在评论区分享交流
一篇文章彻底搞懂 MySQL 和 Redis:原理、区别、项目用法全解析(建议收藏)
一篇文章彻底搞懂 MySQL 和 Redis原理、区别、项目用法全解析建议收藏在现代后端开发中MySQL 和 Redis 是两种最常用的数据存储系统。很多开发者虽然会使用它们但对底层原理和适用场景的理解往往比较模糊。本文将从实战角度出发通过原理分析、对比表格和可运行的代码示例帮你彻底搞懂这两兄弟。## 一、MySQL 和 Redis 的核心原理### 1.1 MySQL磁盘上的关系型数据库MySQL 是基于磁盘存储的关系型数据库管理系统RDBMS。它使用表结构存储数据支持 ACID 事务原子性、一致性、隔离性、持久性。其核心原理如下-存储引擎最常用的是 InnoDB支持行级锁、外键和 MVCC多版本并发控制。-索引机制默认使用 B 树索引适合范围查询和排序。-持久化数据直接写入磁盘通过 redo log 和 binlog 保证数据安全。### 1.2 Redis内存中的键值数据库Redis 是基于内存的键值数据库所有数据读写都在内存中完成因此速度极快微秒级。它的核心原理包括-单线程模型Redis 6.x 之前使用单线程处理命令避免了锁竞争。-数据结构丰富支持字符串、哈希、列表、集合、有序集合等。-持久化机制通过 RDB快照和 AOF追加日志将内存数据持久化到磁盘。## 二、MySQL 和 Redis 的核心区别| 特性 | MySQL | Redis ||---------------------|--------------------------------|--------------------------------|| 存储位置 | 磁盘 | 内存主 磁盘持久化 || 数据模型 | 关系表结构化 | 键值对多种数据结构 || 查询语言 | SQL | 命令如 GET、SET 等 || 事务支持 | 完整 ACID | 有限的事务MULTI/EXEC || 读写速度 | 慢毫秒级受磁盘 I/O 限制 | 极快微秒级内存操作 || 数据容量 | 可支持 TB 级 | 受内存限制通常 GB 级 || 典型场景 | 核心业务数据存储 | 缓存、会话、排行榜、计数器 |一句话总结MySQL 负责“存得住、查得准”Redis 负责“快得飞起”。## 三、项目实战Python 代码演示下面通过两个完整的 Python 示例展示如何在项目中使用 MySQL 和 Redis 协同工作。### 3.1 示例1MySQL 存储用户核心数据本示例演示如何使用 MySQL 存储用户注册信息并进行查询。python# 文件名mysql_demo.py# 依赖安装pip install pymysqlimport pymysql# 连接 MySQL 数据库请根据实际情况修改主机、用户、密码connection pymysql.connect( hostlocalhost, userroot, passwordyour_password, databasetest_db, charsetutf8mb4, cursorclasspymysql.cursors.DictCursor)try: with connection.cursor() as cursor: # 创建用户表如果不存在 create_table_sql CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; cursor.execute(create_table_sql) print(✅ 用户表创建成功) # 插入一条用户记录 insert_sql INSERT INTO users (username, email) VALUES (%s, %s) cursor.execute(insert_sql, (zhangsan, zhangsanexample.com)) connection.commit() print(✅ 用户数据插入成功) # 查询用户 select_sql SELECT * FROM users WHERE username %s cursor.execute(select_sql, (zhangsan,)) user cursor.fetchone() print(f✅ 查询结果{user})finally: connection.close()运行结果示例✅ 用户表创建成功✅ 用户数据插入成功✅ 查询结果{id: 1, username: zhangsan, email: zhangsanexample.com, created_at: datetime.datetime(...)}### 3.2 示例2Redis 缓存用户热点数据在电商场景中用户最近浏览的商品列表适合用 Redis 缓存。本示例模拟缓存用户浏览记录。python# 文件名redis_demo.py# 依赖安装pip install redisimport redisimport json# 连接 Redis默认端口 6379r redis.Redis(hostlocalhost, port6379, decode_responsesTrue)def add_recently_viewed(user_id: int, product_id: int): 将商品 ID 添加到用户的最近浏览列表中。 - 使用 Redis 列表List存储最新浏览放在左侧 - 限制最多保留 10 条记录 key fuser:{user_id}:recently_viewed # 从左侧插入LIFO 风格最新在最前 r.lpush(key, product_id) # 修剪列表只保留前 10 个元素 r.ltrim(key, 0, 9) # 设置过期时间为 1 小时3600 秒 r.expire(key, 3600)def get_recently_viewed(user_id: int) - list: 获取用户最近浏览的商品列表从新到旧 key fuser:{user_id}:recently_viewed # 获取列表全部元素从索引 0 到 -1 return r.lrange(key, 0, -1)# 模拟用户浏览商品user_id 1001for pid in [101, 202, 303, 404]: add_recently_viewed(user_id, pid) print(f✅ 浏览商品 {pid} 已记录)# 获取并打印最近浏览记录recent get_recently_viewed(user_id)print(f✅ 用户 {user_id} 最近浏览的商品{recent})# 输出示例[404, 303, 202, 101]运行结果示例✅ 浏览商品 101 已记录✅ 浏览商品 202 已记录✅ 浏览商品 303 已记录✅ 浏览商品 404 已记录✅ 用户 1001 最近浏览的商品[404, 303, 202, 101]## 四、项目中的典型用法组合在实际项目中MySQL 和 Redis 经常配合使用各司其职| 场景 | MySQL 的职责 | Redis 的职责 ||---------------------|----------------------------------|----------------------------------|| 用户注册/登录 | 存储用户密码哈希、个人信息 | 缓存登录态Session/Token || 商品详情页 | 存储商品描述、价格、库存等 | 缓存热门商品详情减少数据库查询 || 计数器点赞/访问 | 最终数据落盘用于报表 | 实时计数INCR 命令 || 排行榜 | 存储历史排名数据 | 实时排序Sorted Set || 消息队列 | 不推荐用 MySQL 做队列效率低 | 使用 List 或 Stream 实现简单队列 |经典模式先查 Redis如果命中缓存命中则直接返回如果未命中则查询 MySQL并将结果写入 Redis同时设置过期时间。这就是缓存穿透保护的基本思路。## 五、总结-MySQL 是地基适合存储需要持久化、支持复杂查询、保证数据一致性的核心业务数据。它是“慢但可靠”的代表。-Redis 是加速器适合存储高频访问、对时效性要求高、数据结构简单的数据。它是“快但内存贵”的代表。-项目最佳实践不要试图用 MySQL 解决所有问题比如做实时排行榜会非常吃力也不要滥用 Redis 存所有数据内存成本高且无 SQL 查询能力。合理搭配才能打造高效、稳定的系统。希望这篇文章能帮你建立清晰的知识框架。如果你在实际项目中遇到过 MySQL 或 Redis 的坑欢迎在评论区分享交流