课时3:通过缓存来加速数据库访问(MySQL+Redis)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云数据库 Tair(兼容Redis),内存型 2GB
简介: 课时3:通过缓存来加速数据库访问(MySQL+Redis)

Redis入门训练营:课时3:通过缓存来加速数据库访问(MySQL+Redis)

课程地址:https://developer.aliyun.com/trainingcamp/5fd706c381604c09bebaf774a6290c5a?spm=a2cwt.28190922.J_8357884230.1.1e817127ycWQyx

通过缓存来加速数据库访问(MySQL+Redis)

 

内容介绍

一、 缓存模式介绍

二、 实验阶段

 

一、缓存模式介绍

本节主要学习目标是通过缓存来加速数据库的访问,以MySQL和Redis数据库为例。在本节课程中,将使用云资源,包括云数据库Redis版、云数据库ECS以及云数据库RDS MySQL实例。在实验结束后,将了解如何通过Redis来加速MySQL的访问,以及常见的缓存更新模式。

实验的主要内容包括:申请一台ECS、一个MySQL实例和一个Redis实例。之后我们将提供Python脚本来插入数据,并实现演示Redis如何为MySQL实现加速效果。

通常有以下几种缓存模式:Cache-Aside模式、Read\Write模式、Through模式以及Write Behind模式。
本教程主要介绍最常见Cache-Aside模式,主要读取和更新流程如下图所示。

 

image.png

对于读取流程,首先APP从缓存中获取数据。如果数据存在于缓存中,则直接返回。如果缓存未命中,则尝试从数据库中读取数据,然后更新缓存,并顺路过程中返回数据。对于更新流程或删除流程,APP直接操作数据库,然后删除旧的缓存。

Cache-Aside模式的优点是可以有效降低数据库的压力,但缺点是当缓存中的数据更新频繁时,缓存效果会减弱,后面还包括一些背景知识,例如我们在实例中使用的一些云产品,以及Cache-Aside模式的详细介绍,大家可以自行阅读。

 

二、实验阶段

下面,我们开始本次的实验环节,点击“立即开始”以跳转到实验页面。

首先,我们需要选择实验资源。本实验支持三种方式:免费试用、公共资源、个人账户。本次我们选择开通免费试用的方式,点击“开通免费试用”。

image.png

 

首先,我们会看到三个资源卡片,分别是云服务器 ECS、云数据库

RDS MySQL Serverless版本、云数据库Redis版本。我们首先申请

云服务器 ECS,点击“立即试用”。在弹出的页面中,我们首先选

择操作系统。对于操作系统,我们选择 CentOS 7.9 64 位版本,因

为后面有一些环境依赖需要使用这个版本。

地域我们选择杭州。对于到期设置,选择立即设置,到期后自行释

放,然后点击“立即试用”。

image.png

我们跳转到管理控制台,此时存在一台 ECS 待启动状态,等实例启动完成。目前实例的状态已经处于运行状态。
接下来,我们需要连接实例并进行一些环境的初始化操作。

image.png

 

我们点击“远程连接”,选择 Workbench 方式连接,因为在购买实例时没有设置密码,所以现在需要进行密码重置。
点击“重置密码”。对于 root 用户,我们输入一个符合条件的新密码,然后点击“保存密码”。此时需要获取验证码,输入验证码后,密码修改完成,实例会立即重启以使更改生效,点击“立即重启”。

现在实例状态正在重启中,等待实例状态变为运行中后,我们可以再次尝试远程连接。
点击“远程连接”,然后点击“立即登录”,输入我们刚刚重置的实例密码。
image.png

 

目前登录实例成功。接下来,我们进行初始化操作,点击“下一步”。购买 ECS 后,我们需要安装依赖。

首先,我们安装conda ,是一个用于创建独立隔离的 Python 环境的组件。为了创建 Python 环境,输入命令,conda已经安装完成。接下来,我们进行create的 Python 环境,含义是是创建一个名为 "py39" 的 Python 3.9 环境,它会自动下载所需的依赖包,并隔离出一个 Python 3.9 的环境。

image.png

 

目前 Python 环境已经安装完成了。我们可以使用conda activate\py39 来启动它。它提醒我们需要重新登录才能正确激活环境,因此点击“重新登录”来刷新页面。然后再次执行 activate\py39。

此时,当右侧的提示从 "base" 变为 "py39" 时,表示我们已经成功进入了一个 Python 3.9 的环境。接下来,我们需要安装 Redis 和 MySQL 所需的 Python 依赖。

分别包括:redis包、mysql-connector包、执行install。输出 "Successfully installed",表示安装成功。

接下来,我们进行 ECS 的准备工作,创建 RDS MySQL 版。点击 "MySQL" 立即试用。选择地域为杭州,对于可用区,选择与 ECS 相对应的可用区,因为 ECS 在杭州可用区 H,我们也选择 H。因为没有H,那就选择I。专有网络选择默认、交换机的默认配置。然后点击 "立即试用"。
image.png

目前 ECS 产品正在开通中,接下来进行 Redis 的开通。

 

对于Redis版已试用消失的问题,你可以返回上一页,然后再次进入即可。点击 "Redis",然后点击 "立即试用"。
image.png选择地域为杭州,选择可用区H,选择与 ECS 在同一可用区,这样在访问时网络资源会更稳定。对于引擎版本,选择 Redis 7.0 的最新版本,保持默认设置,选择立即设置密码,输入密码则会创建一个默认账号的密码,到期自动续费不进行勾选,然后点击 "立即试用"。
image.png

截止目前,云数据库 Redis 的控制台也已完成,然后现在云数据库 RDS 。可以看到实例列表中有一个正在创建的实例,对于 Redis而言,实例列表中也有一个Redis实例,现在等待资源创建完成,再进行下一步的操作。
image.png

目前可以看到 Redis 实例已经创建完成,RDS 实例也处于运行中状态,现在进行下一步的操作。

第三步,设置白名单和账号。因为 Redis 实例和 RDS MySQL 实例默认禁止外部 IP 访问,所以在开始使用之前,我们需要将客户端和 ECS 实例的 IP 地址添加到 Redis 和 RDS MySQL 实例的白名单中。
image.png

第一步,添加 Redis 实例的白名单。访问Redis 实例的列表,点击白名单设置,点击安全组,选择添加安全组。将默认安全组添加,显示操作成功,则添加成功。

第二步,添加 RDS MySQL 实例的白名单。访问 RDS 实例的列表,点击白名单与分组,选择安全组,点击添加安全组并勾选,最后点击确定,成功添加。

第三步,需要设置 RDS MySQL 的账号,需要访问实例列表,点击账号管理,然后创建账号。
image.png

点击账号管理,选择创建账号,选择创建高权限账号、root账号,输入密码,点击确定。可以看到高权限账号已经添加成功。

接下来,进行实验的第四步,写入测试数据。需要访问ECS,连接到 ECS之后,使用creat-table的 Python 文件来创建数据库表。解释一下creat-table的 Python 文件,会使用 RDS MySQL 的连接地址、账号和密码。

成功连接 MySQL 数据之后,创建一个叫mydatabase的数据库.并连接mydatabase数据库,创建mytable的表,并在表中插入一万条数据,模拟商品 ID 和内容,内容是随机生成的字符串,每个字符串长度为 1024 字节。

接下来,进行这些操作。首先,我们需要获取 RDS MySQL 的主机地址,我们可以跳转到 RDS 的控制台,点击 "基本信息",然后选择 "查看连接详情",从内网连接地址中复制地址并粘贴到终端。对于RDS用户,我们将使用默认的 root用户,密码将是我们之前设置的密码。选择、执行。此时正在执行数据的插入过程。

因为我们的 RDS 实例和 ECS 实例不在同一个可用区,插入过程可能会比较慢,因为不同可用区实例的网络延迟会较大。通常在购买 ECS 实例和 RDS 实例、 Redis 实例时,尽量选择它们在同一个可用区。但如果测试资源无法满足在同一个可用区,则只能选择在不同可用区并接受网络延迟。
image.png

在正式的生产环境中,实例都是可以买到同一可用区的。输出 "Inserted 10000 records",这表示数据插入成功。接下来,我们进行实验的第五步,测试cache-aside模式。
需要创建cache-aside Python 文件并添加实例代码。实验开始之前需要准备redis-host代码、redis的密码以及rds的密码。

对于cache-aside Python 实现了获取数据和更新数据的两个流程。对于获取数据,需要从缓存中获取数据,如果数据存在,则直接返回,如果不存在,则从 MySQL 中读取数据并返回,同时将 Redis 数据设定成功。对于更新数据,我们直接修改 MySQL 中的数据,并删除 Redis 中的数据。删除数据和更新数据同理。

对于主函数,会for循环两次,读取一万条数据。第一次读取时,实际上是从 MySQL 中读取并 Redis 缓存设置。第二次读取时,我们将从 Redis 缓存中读取数据,模拟cache-aside,用 Redis 对 MySQL 的加速效果。

我们复制代码并粘贴到我们的终端中。首先,我们需要设置 Redis 的账号、连接地址和密码。我们到 Redis 的管理控制台界面,点击实例信息,就可以看到实例的连接模式和连接地址。选择专有网络,账号名称选择 default,密码则是我们购买实例时设置的密码。

对于 RDS 的实例信息,我们复制内网连接地址,使用 root 账号,保存文件,执行cache-aside Python 文件。这时将进行两次循环,第一次是读一万条数据,第二次也是读一万条数据。第一次的过程中会将缓存设置,第二次读取时则从缓存中设置。从而达到缓存对于MySQL 数据加速的效果。
image.png

第一次读取一万条数据花费了大约 51 秒,但第二次读取只需 2 秒。这个显著的差距有两个原因:

ECS 实例和 Redis 实例在同一个可用区,在购买时资源满足条件。但对于 RDS 实例,它不在同一个可用区,因此测试效果是这样。

通过使用 ping 命令,可以看到与 RDS 实例的延迟约为 2 毫秒,而在同一可用区的 Redis 实例的时延只有 0.1几毫秒,大约是 RDS 实例延迟的 1/20。

反应了在云上部署业务时需要考虑 ECS 实例和云资源之间的位置和可用区。最好选择在同一可用区的实例,不要跨很大的物理延迟,网络时延的消耗会带来性能的巨大挑战,也会造成不稳定的情况,距离长之后,网络会不稳定。

这就是本次演示的效果,也可以看到第一次读取与第二次读取的数据的差异。

除了网络造成的影响之外,更多的是第二次读取是从Redis中去获取到的数据,也体现了Redis对MySQL加速的访问。最后,这个测试实例和 Redis 实例只提供免费试用三个月,到期后会被释放。

如果想继续使用这些实例,可以选择续费。对于更多的关于 RDS MySQL 和 Redis 结合,以及更多产品特性,可以参见云数据库Redis简介以及RDS简介。

 

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
15天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
158 85
|
17天前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
44 11
|
13天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
39 3
|
13天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
42 3
|
13天前
|
缓存 监控 NoSQL
Redis经典问题:缓存穿透
本文详细探讨了分布式系统和缓存应用中的经典问题——缓存穿透。缓存穿透是指用户请求的数据在缓存和数据库中都不存在,导致大量请求直接落到数据库上,可能引发数据库崩溃或性能下降。文章介绍了几种有效的解决方案,包括接口层增加校验、缓存空值、使用布隆过滤器、优化数据库查询以及加强监控报警机制。通过这些方法,可以有效缓解缓存穿透对系统的影响,提升系统的稳定性和性能。
|
13天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
54 2
|
26天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
181 15
|
20天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
27天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
1月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。

相关产品

  • 云数据库 Tair(兼容 Redis)
  • 推荐镜像

    更多