news 2026/7/23 18:14:25

一篇文章彻底搞懂 MySQL 和 Redis:原理、区别、项目用法全解析(建议收藏)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一篇文章彻底搞懂 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 示例1:MySQL 存储用户核心数据本示例演示如何使用 MySQL 存储用户注册信息,并进行查询。python# 文件名:mysql_demo.py# 依赖安装:pip install pymysqlimport pymysql# 连接 MySQL 数据库(请根据实际情况修改主机、用户、密码)connection = pymysql.connect( host='localhost', user='root', password='your_password', database='test_db', charset='utf8mb4', cursorclass=pymysql.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 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; """ cursor.execute(create_table_sql) print("✅ 用户表创建成功") # 插入一条用户记录 insert_sql = "INSERT INTO users (username, email) VALUES (%s, %s)" cursor.execute(insert_sql, ('zhangsan', 'zhangsan@example.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': 'zhangsan@example.com', 'created_at': datetime.datetime(...)}### 3.2 示例2:Redis 缓存用户热点数据在电商场景中,用户最近浏览的商品列表适合用 Redis 缓存。本示例模拟缓存用户浏览记录。python# 文件名:redis_demo.py# 依赖安装:pip install redisimport redisimport json# 连接 Redis(默认端口 6379)r = redis.Redis(host='localhost', port=6379, decode_responses=True)def add_recently_viewed(user_id: int, product_id: int): """ 将商品 ID 添加到用户的最近浏览列表中。 - 使用 Redis 列表(List)存储,最新浏览放在左侧 - 限制最多保留 10 条记录 """ key = f"user:{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 = f"user:{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 的坑,欢迎在评论区分享交流!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 18:11:22

MagicMouseTrails 使用教程:给 Windows 鼠标加动态光轨,桌面美化新手 5 分钟上手(2026)

作为一名在 IT 运维和桌面支持一线摸爬滚打了 15 年 的老技术人,我每天要在十几台电脑之间来回切换。久而久之,我发现一个看似不起眼、却能显著提升操作爽感的小细节——鼠标指针的轨迹。默认情况下 Windows 的鼠标就是一个生硬的箭头,在深色…

作者头像 李华
网站建设 2026/7/23 18:11:09

2025电赛E题_简易自行瞄准装置_STM32F103RCT6方案详解

2025 电赛 E 题「简易自行瞄准装置」全流程复盘:STM32F103RCT6 K230 双轴无刷云台 陀螺仪前馈关键词:2025电赛E题 简易自行瞄准装置 STM32F103RCT6 K230视觉 无刷云台 PID 陀螺仪前馈 适用人群:备赛 / 复盘 / 想快速搭一套“视觉闭环瞄准”…

作者头像 李华
网站建设 2026/7/23 18:10:26

服务器六层板单一电源层架构下PDN优化方案

服务器硬件普遍采用多相 Buck 降压方案,CPU、内存、各类芯片存在多组独立电源轨,瞬时电流变化剧烈,di/dt 极高。六层板仅有一层专用电源平面,对比八层板可设置双层电源层的架构,电源分配网络设计约束显著增加。很多设计…

作者头像 李华
网站建设 2026/7/23 18:08:40

软路由系统 --- OpenWrt下载安装中文语言包

刚安装好的OpenWrt登录Web管理后台后,发现界面是英文的,在系统的语言选项也只有English,没有中文可切换,那该如何呢?那我们就给它安装个中文的语言包,再来进行切换,看看能行不能行!如…

作者头像 李华