一篇文章彻底搞懂 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 的坑欢迎在评论区分享交流

相关新闻

Mini小主机All-in-one搭建教程2-安装Openwrt软路由系统

Mini小主机All-in-one搭建教程2-安装Openwrt软路由系统

Mini小主机All-in-one搭建教程2-安装Openwrt软路由系统 硬件介绍 在狗东买的 极摩客M2 到手价是2799元 具体配置如下: 酷睿英特尔11代标压ai7 11390H 64G1TB固态。 以下是安装Openwrt软路由系统的教程。 安装Openwrt软路由系统 下载镜像包 首先下载软路由的懒…

2026/9/19 19:56:41 阅读更多 →
Copilot Code Review 从固定 Reviewer 演进为可编程 Runtime,仓库控制面、Setup 供应链、Runner 资源和 MCP 工具同时被纳入审查决策

Copilot Code Review 从固定 Reviewer 演进为可编程 Runtime,仓库控制面、Setup 供应链、Runner 资源和 MCP 工具同时被纳入审查决策

Copilot Code Review 已成为可编程 Agent Runtime(2026-07-17 GitHub Changelog 解析) TL;DR 场景:GitHub 在 2026-07-17 一次性把 Copilot Code Review 的 Instructions、Setup Workflow、Firewall、Runner 与 Cloud Agent 网络策略全部向…

2026/10/6 16:34:56 阅读更多 →
ESXI 8.0虚拟机安装OpenWRT软路由详细教程

ESXI 8.0虚拟机安装OpenWRT软路由详细教程

简介 OpenWrt 是嵌入式的 Linux 路由器固件,OpenWrt在稳定运行的同时提供了强大的扩展能力,用户可以完全的定制属于自己的路由系统,满足不一样的个性化需求,本文讲解如何使用ESXI安装OpenWRT,打造属于自己的软路由。 本次安装使用的是haiibo/openwrt版本。 默认登录信息:…

2026/10/9 5:26:36 阅读更多 →

最新新闻

用Structure Ref实现武器属性换肤:五属性大剑制作全流程解析

用Structure Ref实现武器属性换肤:五属性大剑制作全流程解析

玩武器设计这行,最怕听到“需求很简单”这五个字。尤其当你面对的需求是:做一把大剑,但要求它能裂变出火、冰、雷、毒、圣五种属性,每种属性都要有独立外观、独立数值,还得在战斗里切换得丝滑。我去年接了这么个项目&a…

2026/10/13 7:15:59 阅读更多 →
Java进阶自学路线图:并发编程、JVM与源码阅读实战指南

Java进阶自学路线图:并发编程、JVM与源码阅读实战指南

每当有朋友问起"Java 进阶自学路线图到底怎么定",我都能从对方的问题里听出同一种迷茫:基础学完了,面向对象、集合、IO 这些都会用,Spring Boot 项目也能跑起来,但一看到招聘要求里的"深入理解JVM"…

2026/10/13 7:15:59 阅读更多 →
Clawdbot安全拆解:开源智能体权限管理与防注入实践

Clawdbot安全拆解:开源智能体权限管理与防注入实践

我第一次看到 Clawdbot 演示的时候,是在一个技术交流群里,有人把它做成的自动化流程录成了视频。说实话,那个视频让我第一反应很不舒服:一个开源智能体,把“查资料、写文件、发消息、改配置”这件事做得过于顺滑了。作…

2026/10/13 7:15:59 阅读更多 →
大模型应用开发动手做 AI Agent:从调 API 到跑通任务的完整路径

大模型应用开发动手做 AI Agent:从调 API 到跑通任务的完整路径

简介:《大模型应用开发 动手做AI Agent》是黄佳撰写的一本面向Agent技术学习者与开发者的实战电子书,适合研究人员、开发人员、产品经理、企业负责人及高校相关专业师生阅读,帮助读者从零理解Agent的设计思路并掌握落地方法。全书围绕GPT-4、…

2026/10/13 7:15:59 阅读更多 →
小程序接口签名绕过与纵深防御:从签名机制到验证落地

小程序接口签名绕过与纵深防御:从签名机制到验证落地

1. 从一次接口排查说起:为什么小程序签名如此重要这几年小程序生态渗透到了各个业务场景,从电商、生活服务到企业办公,几乎每个领域都离不开它。但我实际在做安全测试和接口联调时发现,很多开发团队把签名校验当成一个“加上就安心…

2026/10/13 7:15:59 阅读更多 →
CO-RE实战:一次编译到处运行,解决eBPF内核适配难题

CO-RE实战:一次编译到处运行,解决eBPF内核适配难题

1. 为什么要折腾 CO-RE:从一次内核升级说起如果你在服务器上跑过基于 BPF 的追踪工具,大概率遇到过一个既无奈又经典的报错:libbpf: failed to find valid kernel BTF或者更早以前,你辛辛苦苦在开发机上编译好的 BPF 程序&#xf…

2026/10/13 7:14:58 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →