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

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云数据库 Tair(兼容Redis),内存型 2GB
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
相关文章
|
1月前
|
NoSQL 关系型数据库 MySQL
2024Mysql And Redis基础与进阶操作系列(4-2)作者——LJS[含MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法]
24MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法(4-2) 学不会你来砍我!!!
|
15天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
84 26
|
1天前
|
NoSQL 关系型数据库 MySQL
Linux安装jdk、mysql、redis
Linux安装jdk、mysql、redis
34 7
|
1月前
|
SQL 缓存 关系型数据库
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴因未能系统梳理MySQL缓存机制而在美团面试中失利。为此,尼恩对MySQL的缓存机制进行了系统化梳理,包括一级缓存(InnoDB缓存)和二级缓存(查询缓存)。同时,他还将这些知识点整理进《尼恩Java面试宝典PDF》V175版本,帮助大家提升技术水平,顺利通过面试。更多技术资料请关注公号【技术自由圈】。
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
|
1月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
65 14
|
1月前
|
存储 NoSQL 关系型数据库
MySQL和Redis的区别
**MySQL和Redis的区别** MySQL和Redis都是流行的数据存储解决方案,但它们在设计、用途和特性上有显著区别。理解这些区别有助于选择合适的数据库来满足不同的应用需求。本文将详细介绍MySQL和Redis的区别,包括它们的架构、使用场景、性能和其他关键特性。 ### 一、基本概述 **MySQL**: MySQL是一个关系型数据库管理系统(RDBMS),使用结构化查询语言(SQL)进行数据管理。它支持事务、复杂查询和多种存储引擎,广泛应用于各种Web应用、企业系统和数据分析项目。 **Redis**: Redis是一个基于内存的键值数据库,通常被称为NoSQL数
82 4
|
1月前
|
NoSQL 安全 关系型数据库
2024Mysql And Redis基础与进阶操作系列(6)作者——LJS[含MySQL 多表之一对一/多;多对多;多表联合查询等详解步骤及常见报错问题所对应的解决方法]
MySQL 多表之一对一/多;多对多;多表联合之交叉连接;内连接;左、右、外、满、连接;子查询及关键字;自连接查询等详解步骤及常见报错问题所对应的解决方法
|
1月前
|
缓存 NoSQL 关系型数据库
mysql和缓存一致性问题
本文介绍了五种常见的MySQL与Redis数据同步方法:1. 双写一致性,2. 延迟双删策略,3. 订阅发布模式(使用消息队列),4. 基于事件的缓存更新,5. 缓存预热。每种方法的实现步骤、优缺点均有详细说明。
|
1月前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
1月前
|
SQL NoSQL 关系型数据库

相关产品

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

    更多