Redis入门训练营:课时3:通过缓存来加速数据库访问(MySQL+Redis)
通过缓存来加速数据库访问(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模式,主要读取和更新流程如下图所示。
对于读取流程,首先APP从缓存中获取数据。如果数据存在于缓存中,则直接返回。如果缓存未命中,则尝试从数据库中读取数据,然后更新缓存,并顺路过程中返回数据。对于更新流程或删除流程,APP直接操作数据库,然后删除旧的缓存。
Cache-Aside模式的优点是可以有效降低数据库的压力,但缺点是当缓存中的数据更新频繁时,缓存效果会减弱,后面还包括一些背景知识,例如我们在实例中使用的一些云产品,以及Cache-Aside模式的详细介绍,大家可以自行阅读。
二、实验阶段
下面,我们开始本次的实验环节,点击“立即开始”以跳转到实验页面。
首先,我们需要选择实验资源。本实验支持三种方式:免费试用、公共资源、个人账户。本次我们选择开通免费试用的方式,点击“开通免费试用”。
首先,我们会看到三个资源卡片,分别是云服务器 ECS、云数据库
RDS MySQL Serverless版本、云数据库Redis版本。我们首先申请
云服务器 ECS,点击“立即试用”。在弹出的页面中,我们首先选
择操作系统。对于操作系统,我们选择 CentOS 7.9 64 位版本,因
为后面有一些环境依赖需要使用这个版本。
地域我们选择杭州。对于到期设置,选择立即设置,到期后自行释
放,然后点击“立即试用”。
我们跳转到管理控制台,此时存在一台 ECS 待启动状态,等实例启动完成。目前实例的状态已经处于运行状态。
接下来,我们需要连接实例并进行一些环境的初始化操作。
我们点击“远程连接”,选择 Workbench 方式连接,因为在购买实例时没有设置密码,所以现在需要进行密码重置。
点击“重置密码”。对于 root 用户,我们输入一个符合条件的新密码,然后点击“保存密码”。此时需要获取验证码,输入验证码后,密码修改完成,实例会立即重启以使更改生效,点击“立即重启”。
现在实例状态正在重启中,等待实例状态变为运行中后,我们可以再次尝试远程连接。
点击“远程连接”,然后点击“立即登录”,输入我们刚刚重置的实例密码。
目前登录实例成功。接下来,我们进行初始化操作,点击“下一步”。购买 ECS 后,我们需要安装依赖。
首先,我们安装conda ,是一个用于创建独立隔离的 Python 环境的组件。为了创建 Python 环境,输入命令,conda已经安装完成。接下来,我们进行create的 Python 环境,含义是是创建一个名为 "py39" 的 Python 3.9 环境,它会自动下载所需的依赖包,并隔离出一个 Python 3.9 的环境。
目前 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。专有网络选择默认、交换机的默认配置。然后点击 "立即试用"。
目前 ECS 产品正在开通中,接下来进行 Redis 的开通。
对于Redis版已试用消失的问题,你可以返回上一页,然后再次进入即可。点击 "Redis",然后点击 "立即试用"。
选择地域为杭州,选择可用区H,选择与 ECS 在同一可用区,这样在访问时网络资源会更稳定。对于引擎版本,选择 Redis 7.0 的最新版本,保持默认设置,选择立即设置密码,输入密码则会创建一个默认账号的密码,到期自动续费不进行勾选,然后点击 "立即试用"。
截止目前,云数据库 Redis 的控制台也已完成,然后现在云数据库 RDS 。可以看到实例列表中有一个正在创建的实例,对于 Redis而言,实例列表中也有一个Redis实例,现在等待资源创建完成,再进行下一步的操作。
目前可以看到 Redis 实例已经创建完成,RDS 实例也处于运行中状态,现在进行下一步的操作。
第三步,设置白名单和账号。因为 Redis 实例和 RDS MySQL 实例默认禁止外部 IP 访问,所以在开始使用之前,我们需要将客户端和 ECS 实例的 IP 地址添加到 Redis 和 RDS MySQL 实例的白名单中。
第一步,添加 Redis 实例的白名单。访问Redis 实例的列表,点击白名单设置,点击安全组,选择添加安全组。将默认安全组添加,显示操作成功,则添加成功。
第二步,添加 RDS MySQL 实例的白名单。访问 RDS 实例的列表,点击白名单与分组,选择安全组,点击添加安全组并勾选,最后点击确定,成功添加。
第三步,需要设置 RDS MySQL 的账号,需要访问实例列表,点击账号管理,然后创建账号。
点击账号管理,选择创建账号,选择创建高权限账号、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 实例时,尽量选择它们在同一个可用区。但如果测试资源无法满足在同一个可用区,则只能选择在不同可用区并接受网络延迟。
在正式的生产环境中,实例都是可以买到同一可用区的。输出 "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 数据加速的效果。
第一次读取一万条数据花费了大约 51 秒,但第二次读取只需 2 秒。这个显著的差距有两个原因:
ECS 实例和 Redis 实例在同一个可用区,在购买时资源满足条件。但对于 RDS 实例,它不在同一个可用区,因此测试效果是这样。
通过使用 ping 命令,可以看到与 RDS 实例的延迟约为 2 毫秒,而在同一可用区的 Redis 实例的时延只有 0.1几毫秒,大约是 RDS 实例延迟的 1/20。
反应了在云上部署业务时需要考虑 ECS 实例和云资源之间的位置和可用区。最好选择在同一可用区的实例,不要跨很大的物理延迟,网络时延的消耗会带来性能的巨大挑战,也会造成不稳定的情况,距离长之后,网络会不稳定。
这就是本次演示的效果,也可以看到第一次读取与第二次读取的数据的差异。
除了网络造成的影响之外,更多的是第二次读取是从Redis中去获取到的数据,也体现了Redis对MySQL加速的访问。最后,这个测试实例和 Redis 实例只提供免费试用三个月,到期后会被释放。
如果想继续使用这些实例,可以选择续费。对于更多的关于 RDS MySQL 和 Redis 结合,以及更多产品特性,可以参见云数据库Redis简介以及RDS简介。