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

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: 课时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简介。

 

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
17天前
|
缓存 NoSQL 关系型数据库
13- Redis和Mysql如何保证数据⼀致?
该内容讨论了保证Redis和MySQL数据一致性的几种策略。首先提到的两种方法存在不一致风险:先更新MySQL再更新Redis,或先删Redis再更新MySQL。第三种方案是通过MQ异步同步以达到最终一致性,适用于一致性要求较高的场景。项目中根据不同业务需求选择不同方案,如对一致性要求不高的情况不做处理,时效性数据设置过期时间,高一致性需求则使用MQ确保同步,最严格的情况可能涉及分布式事务(如Seata的TCC模式)。
44 6
|
1天前
|
缓存 NoSQL Redis
深度解析Redis的缓存双写一致性
【4月更文挑战第20天】
10 1
|
2天前
|
存储 缓存 NoSQL
Redis入门到通关之Redis缓存数据实战
Redis入门到通关之Redis缓存数据实战
|
2天前
|
消息中间件 缓存 数据库
如何保证缓存与数据库的数据一致性?
如何保证缓存与数据库的数据一致性?
17 5
|
2天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL与NoSQL的主要区别在于数据结构、查询语言和可扩展性。MySQL是关系型数据库,依赖预定义的数据表结构,使用SQL进行复杂查询,适合垂直扩展。而NoSQL提供灵活的存储方式(如JSON、哈希表),无统一查询语言,支持横向扩展,适用于处理大规模、非结构化数据和高并发场景。选择哪种取决于应用需求、数据模型及扩展策略。
10 0
|
3天前
|
存储 缓存 运维
软件体系结构 - 缓存技术(5)Redis Cluster
【4月更文挑战第20天】软件体系结构 - 缓存技术(5)Redis Cluster
136 10
|
7天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
129 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
11天前
|
SQL 缓存 Java
Java数据库连接池:优化数据库访问性能
【4月更文挑战第16天】本文探讨了Java数据库连接池的重要性和优势,它能减少延迟、提高效率并增强系统的可伸缩性和稳定性。通过选择如Apache DBCP、C3P0或HikariCP等连接池技术,并进行正确配置和集成,开发者可以优化数据库访问性能。此外,批处理、缓存、索引优化和SQL调整也是提升性能的有效手段。掌握数据库连接池的使用是优化Java企业级应用的关键。
|
11天前
|
缓存 NoSQL Java
使用Redis进行Java缓存策略设计
【4月更文挑战第16天】在高并发Java应用中,Redis作为缓存中间件提升性能。本文探讨如何使用Redis设计缓存策略。Redis是开源内存数据结构存储系统,支持多种数据结构。Java中常用Redis客户端有Jedis和Lettuce。缓存设计遵循一致性、失效、雪崩、穿透和预热原则。常见缓存模式包括Cache-Aside、Read-Through、Write-Through和Write-Behind。示例展示了使用Jedis实现Cache-Aside模式。优化策略包括分布式锁、缓存预热、随机过期时间、限流和降级,以应对缓存挑战。
|
19天前
|
存储 缓存 NoSQL
使用redis进行缓存加速
使用redis进行缓存加速
27 0

相关产品

  • 云数据库 Redis 版
  • 推荐镜像

    更多