首页 应对高并发,利用Redis版缓存实现极速响应

应对高并发,利用Redis版缓存实现极速响应

更新时间: 2024-09-24 11:02:45

手动部署

80

https://www.aliyun.com/solution/tech-solution/redis-cache-speedup

方案概览

本方案旨在基于云数据库Redis版(ApsaraDB for Redis)构建缓存以提速应用,提升业务系统的性能,降低响应时间,使应用能够过承担更高的负载。

方案架构

方案提供的默认设置完成部署后在阿里云上搭建的运行环境如下图所示。实际部署时您可以根据资源规划修改部分设置,但最终形成的运行环境与下图相似。image

方案示例模拟了员工与部门关联的场景,通过HTTP API以部门ID为参数,获取部门下的员工ID以及姓名。数据优先从数据库中查询,选择使用Redis作为缓存后,首次加载仍然通过数据库查询,之后的查询将会优先从Redis中取出结果。在清理掉数据库数据之后,由于缓存在有效期,仍然可以查询到结果。

本方案的技术架构包括以下基础设施和云服务:

  • 1个专有网络VPC:为应用型负载均衡ALB、云服务器ECS、云数据库 RDS MySQL 版、云数据库Redis版等云资源形成云上私有网络。

  • 1台交换机:将1台云服务器ECS连接在同一网络上,实现它们之间的通信,并提供基本的网络分段和隔离功能。

  • 1台云服务器ECS:用于部署模拟服务。

  • 1个云数据库RDS MySQL版实例:为模拟服务提供数据服务。

  • 1个云数据库Redis版实例:提供缓存服务

部署准备

10

开始部署前,请按以下指引完成账号申请、账号充值。

准备账号

  1. 如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。

  2. 为阿里云账号充值。本方案的云资源支持按量付费,且默认设置均采用按量付费引导操作。如果确定任何一个云资源采用按量付费方式部署,账户余额都必须大于等于100元。

规划网络和资源

10

网络规划

请参考表格中的说明和方案默认示例值为每个规划项做详细规划并在实际部署时将默认示例值修改为您的实际规划。

规划项

数量

说明

地域

1

您的云服务部署的地域。选择地域的基本原则请参见地域和可用区

专有网络VPC

1

在部署过程中新建一个VPC作为本方案的专有网络。

交换机

1

本方案需要1台交换机,用来连接不同的云资源实例。

公网IP

1

创建云服务器ECS实例时,选择分配公网IP地址,自动为云服务器ECS实例创建1个公网IP。

安全组

1

用于限制专有网络VPC下云服务器ECS的网络流入和流出规则。

规划云资源

请参考表格中的说明和方案默认示例值为每个规划项做详细规划并在实际部署时将默认示例值修改为您的实际规划。

规划项

数量

说明

ECS

1

本方案需要1台ECS实例,用于部署模拟服务。

RDS MySQL

1

本方案需要1个RDS MySQL版实例,用于存储模拟数据(用户,部门等)。

RDS Redis

1

本方案需要1个RDS Redis版实例,用于缓存。

部署资源

30

规划好资源后,请按照以下步骤部署方案中的所有资源。

创建专有网络VPC和交换机

为了实现高可用,您需要将云服务器等资源尽可能分布在多个可用区,规避单可用区故障造成的服务不可用。本方案以双可用区为例,因此,您需要创建1个专有网络和2个交换机。

  1. 登录专有网络管理控制台

  2. 在顶部菜单栏,选择华东1(杭州)地域。

  3. 在左侧导航栏,单击专有网络

  4. 专有网络页面,单击创建专有网络

  5. 创建专有网络页面,配置1个专有网络和1台交换机。配置交换机时,请确保交换机所属的可用区的ECS、RDS MySQL版以及RDS Redis版是可用状态。

    项目

    说明

    示例值

    VPC名称

    建议您在部署过程中新建一个VPC作为本方案的专有网络。部署过程中填写VPC名称即可创建对应名称的VPC。

    长度为2~128个字符,以英文大小字母或中文开头,可包含数字、下划线(_)和连字符(-)。

    VPC_HZ

    IPv4网段

    在创建VPC时,您必须按照无类域间路由块(CIDR block)的格式为您的专有网络划分私网网段。阿里云VPC支持的网段信息请参见组成部分

    在网络规划时可以按照管理网段-开发网段-测试网段-生产网段等规则做好规划。网段一旦投入使用,调整过程复杂,因此规划十分重要。

    192.168.0.0/16

    Vswitch名称

    建议您在部署过程中在新建的VPC内创建虚拟交换机。部署过程中填写交换机名称即可创建对应名称的虚拟交换机。

    长度为2~128个字符,以英文大小字母或中文开头,可包含数字、下划线(_)和连字符(-)。

    • vsw_001

    可用区

    在规划的地域内选择1个可用区,1台虚拟交换机部署在1个可用区。

    建议选择排序靠后的,一般此类可用区较新。新可用区资源更充沛,新规格也会在新的可用区优先上线。

    • 可用区 H

    IPv4网段

    每台虚拟交换机需要一个IPv4网段

    • vsw_001:192.168.1.0/24

创建安全组

您已经在1个专有网络VPC下的2个可用区分别创建1台交换机。接下来您需要创建1个跨可用区的安全组,用于限制该专有网络VPC下的2台交换机的网络流入和流出。

  1. 登录ECS管理控制台

  2. 在顶部菜单栏,选择华东1(杭州)地域。

  3. 在左侧导航栏,选择网络与安全>安全组

  4. 安全组页面,单击创建安全组

  5. 创建安全组页面,创建1个安全组。

    项目

    说明

    示例值

    名称

    设置安全组的名称。

    SecurityGroup_1

    网络

    选择之前规划的专有网络VPC。

    VPC_HZ

    安全组类型

    本方案需从公网拉取博客网站服务镜像,因此选择普通安全组,以实现公网出方向所有地址可访问。实际部署时,您建议选择安全性更高的企业级安全组。

    普通安全组

    入方向

    入方向除默认的端口号外,本方案还需添加3306端口号以及6379端口号。

    3306

    6379

创建云服务器ECS

您已经创建1个专有网络VPC。接下来您需要在可用区创建1个云服务器ECS实例,对外提供服务。

  1. 登录ECS管理控制台

  2. 在顶部菜单栏,选择华东1(杭州)地域。

  3. 在左侧导航栏,选择实例与镜像>实例

  4. 实例页面,单击创建实例

  5. 在云服务器ECS购买页面,创建1台云服务器ECS。

    项目

    说明

    示例值

    实例名称

    需要一个实例名称。

    APP001

    可用区

    本方案要求一台云服务器ECS实例与一个虚拟交换机位于同一可用区

    可用区 H

    支付方式

    ECS实例的计费方式。

    ECS计费的详细信息请参见计费方式概述

    按量付费

    实例规格

    ECS的实例规格及内核、vCPU数量。关于ECS选型的最佳实践请参见ECS选型最佳实践

    ecs.c6.large

    镜像

    ECS的“装机盘”,为ECS实例提供操作系统、预装软件等。

    Alibaba Cloud Linux

    镜像版本

    镜像的版本。

    Alibaba Cloud Linux 3.2104 LTS 64位(安全加固)

    系统盘类型

    硬盘类型。

    ESSD云盘

    系统盘容量

    硬盘容量。

    40 GiB

    公网IP

    用于在云服务器ECS上从公网安装必须软件和配置模拟应用服务。

    分配公网 IPv4 地址

    带宽计费方式

    由于本方案只需在云服务器ECS上从公网安装必须软件和配置模拟应用服务,因此选择按使用流量,以节省流量成本。

    按使用流量

    带宽值

    本方案以5 Mbps为例。

    5 Mbps

    安全组

    两台ECS都使用之前创建的安全组。

    SecurityGroup_1

创建云数据库RDS MySQL版

您已经创建1台云服务器ECS。接下来您需要创建云数据库 RDS MySQL 版实例、数据库、数据库账号。您需要记录创建的云数据库PolarDB MySQL版的内网连接地址、数据库名称、账号、密码用于之后的模拟应用配置。

  1. 登录云数据库RDS控制台

  2. 创建云数据库RDS MySQL版实例:

    1. 全局概览页面,单击创建实例

    2. 在购买页面,购买1个云数据库RDS MySQL版实例,其他保存默认即可。

    3. 项目

      说明

      示例值

      地域

      本方案以华东1(杭州)地域为例。

      华东1(杭州)

      计费方式

      本方案以创建按量付费为例。

      按量付费

      引擎

      本方案以MySQL为例。

      MySQL 8.0

      产品系列

      本方案使用基础系列,生产环境请使用高可用系列集群系列

      基础系列

      规格

      数据库规格

      mysql.n1e.medium.1

      网络类型

      默认选择专有网络

      专有网络

      专有网络VPC

      选择之前规划的专有网络VPC。

      VPC_HZ

      交换机

      选择之前规划的交换机。

      vsw_001:192.168.1.0/24

    4. 等待数据库实例生产完成。

  3. 创建数据库账号:

    1. 在左侧导航栏,选择实例列表

    2. 实例列表页面,单击创建的实例。

    3. 在左侧导航栏,选择账号管理

    4. 单击创建账号

    5. 创建账号面板,设置数据库账号名称(此处需设定为rds),选择账号类型为普通账号,设置密码,然后单击确定

  4. 创建数据库:

    1. 在左侧导航栏,选择配置与管理 > 数据库管理

    2. 单击创建数据库

    3. 创建数据库面板,设置数据库名称(此处需设定为biz),设置字符集utf8mb4,选择授权账号为上一步创建的账号,然后单击创建

  5. 设置白名单:

    1. 在左侧导航栏,选择配置与管理 > 白名单与安全组

    2. 添加安全组面板,选择规划的安全组,然后单击确定

  6. 获取数据库的内网地址:

    1. 在左侧导航栏,单击数据库连接

    2. 数据库连接区域,复制内网地址

创建云数据库Redis版

您已经创建1台云服务器ECS,1个云数据库 RDS MySQL 版实例。接下来您需要创建云数据库 Redis版实例、数据库、数据库账号。您需要记录创建的云数据库 Redis版实例的内网连接地址、数据库名称、账号、密码用于之后的模拟应用配置。

  1. 登录云数据库Redis版控制台

  2. 创建云数据库Redis版实例:

    1. 全局概览页面,单击创建云原生实例

    2. 在购买页面,购买1个云数据库Redis版实例,其他保存默认即可。

    3. 项目

      说明

      示例值

      地域

      本方案以华东1(杭州)地域为例。

      华东1(杭州)

      计费方式

      本方案以创建按量付费为例。

      按量付费

      产品

      本方案以Redis为例。

      Redis

      部署模式

      本方案使用云原生(原云盘),部署模式比较请参考文档:云原生实例和经典实例对比

      云原生(原云盘)

      系列

      本方案以标准版为例。

      标准版

      可用区

      本方案以单可用区为例。

      单可用区

      主可用区

      选择虚拟交换机所在可用区

      杭州 可用区H

      网络类型

      默认选择专有网络

      专有网络

      专有网络VPC

      选择之前规划的专有网络VPC。

      VPC_HZ

      交换机

      选择之前规划的交换机。

      vsw_001:192.168.1.0/24

      实例类型

      本方案以高可用为例。

      高可用

      大版本

      本方案以Redis 6.0为例。

      Redis 6.0

      架构类型

      标准主备架构,详情请参考文档:标准架构

      不启用集群

      实例名称

      可根据实际情况选择。

      redis

    4. 等待数据库实例生产完成。

  3. 创建数据库账号:

    1. 在左侧导航栏,选择实例列表

    2. 实例列表页面,单击创建的实例。

    3. 在左侧导航栏,选择账号管理

    4. 单击创建账号

    5. 创建账号面板,设置数据库账号名称(此处需设定为redis),选择账号权限设置为读写,设置密码,然后单击确定

  4. 设置白名单:

    1. 在左侧导航栏,选择配置与管理 > 白名单设置

    2. 白名单设置面板,点击添加白名单设分组分组名称填入ecs添加方式选择加载ECS私网IP,选择已经创建的ECS IP,点击确定

    3. 安全组面板,选择规划的安全组,然后单击确定

  5. 获取数据库的内网地址:

    1. 在左侧导航栏,单击实例信息数

    2. 连接信息区域,在专有网络一行,复制连接地址

配置模拟应用服务

10

部署模拟服务

创建了云资源后,接下来您需要执行以下操作使用云资源初始化模拟服务。

  1. 登录ECS管理控制台

  2. 在顶部菜单栏,选择华东1(杭州)地域。

  3. 在左侧导航栏,选择实例与镜像>实例

  4. 部署博客网站服务。

    1. 实例页面,找到创建的一台ECS实例,在其右侧操作列,单击远程连接

    2. 远程连接对话框的通过Workbench远程连接区域,单击立即登录,然后根据页面提示登录。

    3. 执行以下命令部署模拟应用服务。

      yum install nginx -y
      yum install java-1.8.0-openjdk.x86_64 -y
      cat <<'EOF' > /etc/nginx/conf.d/app_with_redis.conf
      server {
          listen 80 default_server;
          server_name _;
      
          location / {
              proxy_pass http://localhost:8080;
              proxy_set_header Host $host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-Proto $scheme;
          }
      }
      EOF
      sed -i 's/ _;/ domain.not.exists;/' /etc/nginx/nginx.conf
      curl -o AppWithRedisDemo.jar 'https://help-static-aliyun-doc.aliyuncs.com/demos/AppWithRedisDemo.jar'
      nohup java -DMYSQL_HOST=rm-bp1***4gb.mysql.rds.aliyuncs.com -DMYSQL_PASSWORD=PASS***WORD -DREDIS_HOST=r-bp1***zra.redis.rds.aliyuncs.com -DREDIS_PASSWORD=redis:PASS***WORD -jar AppWithRedisDemo.jar &
      /bin/systemctl start nginx.service

      其中19行MYSQL_HOST需要设定为创建云数据库RDS MySQL版实例的内网地址;MYSQL_PASSWORD需要设定为创建云数据库RDS MySQL版实例的数据库密码;REDIS_HOST需要设定为创建云数据库Redis版实例的内网地址;REDIS_PASSWORD需要设定为创建云数据库Redis版实例的数据库密码;

准备测试数据

初始化模拟服务后,您需要调用模拟服务的初始化接口导入模拟数据。

  1. 登录ECS管理控制台

  2. 在顶部菜单栏,选择华东1(杭州)地域。

  3. 在左侧导航栏,选择实例与镜像>实例

  4. 部署模拟应用服务。

    1. 实例页面,找到创建的一台ECS实例,在其右侧操作列,单击远程连接

    2. 远程连接对话框的通过Workbench远程连接区域,单击立即登录,然后根据页面提示登录。

    3. 在终端中执行指令

      curl http://localhost:8080/initData?token=AppWithRedis

      如返回值为

      {"success":true,"message":"success","data":""}

      则说明测试数据准备完成。

    4. 登录云数据库RDS控制台,在实例列表页面,找到目标实例,点击实例名称;

    5. 在新页面点击登录数据库,如遇到提示欢迎使用极简模式,可以选择跳过,直接使用。如遇到提示创建DMS服务关联角色,点击确认。如遇到提示实例自动接入开关,默认选择为,可根据需要选择,可以在界面右上角点击实例自动接入:进行配置。

    6. 如出现了登录实例对话框,输入数据库账号(此处为rds)密码(此处为用户设置的密码),管控模式选择自由操作,点击登录

    7. 在SQLConsole窗口中输入

      SELECT * FROM `employee_department` 

      可以看到当前数据库中存在的数据。

完成及清理

20

方案验证

一、缓存验证

完成了一键部署之后,通过ECS实例的公网IP可以访问应用接口,通过不同参数验证方案。

  1. 验证不带缓存的接口

通过浏览器访问http://<ECS公网IP>/getAllEmployeesInDepartment?departmentId=1&cacheFirst=false接口,返回值为:

{
  "success": true,
  "message": "success",
  "data": [
    {
      "id": 1,
      "name": "Alice"
    },
    {
      "id": 2,
      "name": "Ben"
    },
    {
      "id": 3,
      "name": "Charlotte"
    },
    {
      "id": 4,
      "name": "David"
    }
  ]
}
  1. 通过浏览器访问http://<ECS公网IP>/getAllEmployeesInDepartment?departmentId=1&cacheFirst=true接口,返回值与步骤1相同,此时再次访问此接口,返回值为:

{
  "success": true,
  "message": "success from cache",
  "data": [
    {
      "id": 1,
      "name": "Alice"
    },
    {
      "id": 2,
      "name": "Ben"
    },
    {
      "id": 3,
      "name": "Charlotte"
    },
    {
      "id": 4,
      "name": "David"
    }
  ]
}

可见message字段中提示当前数据从缓存中读取。

  1. 验证缓存数据:

    1. 登录云数据库Redis版控制台,在实例列表页面,找到目标实例,点击实例名称;

    2. 在新页面点击登录数据库,如出现了登录实例对话框,输入数据库账号(此处为redis)密码(此处为用户设置的密码),安全托管可以选择不开启,管控模式选择自由操作,点击登录

    3. 在SQLConsole中输入:GET department:1image可以看到执行历史中返回值为接口数据:

      [{"id":1,"name":"Alice"},{"id":2,"name":"Ben"},{"id":3,"name":"Charlotte"},{"id":4,"name":"David"}]

二、数据库压力对比验证

为了进一步验证方案在高并发场景下数据库的压力情况,我们使用负载测试工具 Locust(参考官方文档安装) 进行测试。

  1. 性能测试:无缓存接口

    1. 创建文件locustfile.py,完整代码如下:

      from locust import HttpUser, task, between
      
      class UserBehaviorWithoutCache(HttpUser):
          wait_time = between(1, 5)
      
          @task
          def query_department_without_cache(self):
              self.client.get("/getAllEmployeesInDepartment?departmentId=1&cacheFirst=false")
      
      if __name__ == "__main__":
          import os
          os.system("locust -f <this_script_name>.py")
    2. 在命令行中运行locust启动 Locust。打开浏览器,访问 Locust Web 界面 http://localhost:8089,如图所示填写新的测试参数。image (1)参数说明:

      • Number of users:并发用户数量。

      • Ramp up:即每秒钟增加的用户数量。

      • Host:目标系统的基地址,例如:http://<ECS公网IP>。

    3. 启动测试并执行一段时间后,点击 Stop 停止测试。

    4. 登录云数据库RDS控制台,在实例列表页面,找到目标实例,点击监控。image (2)

  2. 性能测试:缓存接口

    1. 修改locustfile.py代码如下:

      from locust import HttpUser, task, between
      
      class UserBehaviorWithCache(HttpUser):
          wait_time = between(1, 5)
      
          @task
          def query_department_with_cache(self):
              self.client.get("/getAllEmployeesInDepartment?departmentId=1&cacheFirst=true")
      
      if __name__ == "__main__":
          import os
          os.system("locust -f <this_script_name>.py")
    2. 在命令行中运行locust启动 Locust,参考上一步的操作,完成测试,并查看RDS监控。image (3)

  3. 对比分析:

    对比前后两次的数据库监控数据,可以明显看出,在测试无缓存接口时,数据库的流量吞吐量、TPS/QPS、执行次数等指标发生了显著变化,出现了一个处理波峰。而在访问带缓存的接口时,这些指标则更为平滑。具体来看,无缓存访问时的执行次数峰值接近700,而带缓存的情况下则稳定在个位数。这表明缓存机制能够有效缓解数据库的压力。

三、缓存命中验证

  1. 清理数据库中的数据记录:

    1. 登录云数据库RDS控制台,在实例列表页面,找到目标实例,点击实例名称;

    2. 在新页面点击登录数据库,如出现了登录实例对话框,输入数据库账号(此处为rds)密码(此处为用户设置的密码),管控模式选择自由操作,点击登录

    3. 在SQLConsole窗口中输入

DELETE FROM `employee_department` 

执行历史出现提示:

------[执行成功]------
[语句1]:  DELETE FROM `employee_department`
[耗时]: 11 (ms)
[影响行数]: 6

说明数据清理完成。

  1. 访问缓存接口:

    通过浏览器访问http://<公网IP>/getAllEmployeesInDepartment?departmentId=1&cacheFirst=true接口,返回值为:

{
  "success": true,
  "message": "success from cache",
  "data": [
    {
      "id": 1,
      "name": "Alice"
    },
    {
      "id": 2,
      "name": "Ben"
    },
    {
      "id": 3,
      "name": "Charlotte"
    },
    {
      "id": 4,
      "name": "David"
    }
  ]
}

可见 message 字段中提示当前数据从缓存中读取,说明缓存已被正确命中。

清理资源

在本方案中,您创建了1台云服务器ECS实例、1个交换机、1个专有网络VPC、1个云数据库RDS MySQL版实例,1个云数据库Redis版实例 。测试完方案后,您可以参考以下规则处理对应产品的实例,避免继续产生费用:

  1. 释放2台云服务器ECS实例:

    登录ECS控制台,在实例页面,找到目标实例,然后在操作列选择216更多-竖向..png>释放设置,根据界面提示释放实例。

  2. 释放1台交换机:

    登录专有网络控制台,在交换机页面,找到目标交换机,然后在操作列单击删除,按照界面提示释放实例。

  3. 释放1个专有网络VPC:

    登录专有网络控制台,在专有网络页面,找到目标VPC,然后在操作列单击删除,按照界面提示释放实例。

  4. 释放1个云数据库RDS MySQL版实例:

    登录云数据库RDS控制台,在实例列表页面,找到目标实例,然后在操作列中选择更多>释放实例

  5. 释放1个云数据库Redis版实例:

    登录云数据库Redis版控制台,在实例列表页面,找到目标实例,然后在操作列中选择216更多-竖向..png>删释放

一键部署

60

https://www.aliyun.com/solution/tech-solution/redis-cache-speedup

方案概览

本方案旨在基于云数据库Redis版(ApsaraDB for Redis)构建缓存以提速应用,提升业务系统的性能,降低响应时间,使应用能够过承担更高的负载。

方案架构

方案提供的默认设置完成部署后在阿里云上搭建的运行环境如下图所示。实际部署时您可以根据资源规划修改部分设置,但最终形成的运行环境与下图相似。image

方案示例模拟了员工与部门关联的场景,通过HTTP API以部门ID为参数,获取部门下的员工ID以及姓名。数据优先从数据库中查询,选择使用Redis作为缓存后,首次加载仍然通过数据库查询,之后的查询将会优先从Redis中取出结果。在清理掉数据库数据之后,由于缓存在有效期,仍然可以查询到结果。

本方案的技术架构包括以下基础设施和云服务:

  • 1个专有网络VPC:为应用型负载均衡ALB、云服务器ECS、云数据库 RDS MySQL 版、云数据库Redis版等云资源形成云上私有网络。

  • 1台交换机:将1台云服务器ECS连接在同一网络上,实现它们之间的通信,并提供基本的网络分段和隔离功能。

  • 1台云服务器ECS:用于部署模拟服务。

  • 1个云数据库RDS MySQL版实例:为模拟服务提供数据服务。

  • 1个云数据库Redis版实例:提供缓存服务

部署准备

10

开始部署前,请按以下指引完成账号申请、账号充值、RAM用户创建和授权。

准备账号

  1. 如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。

  2. 为阿里云账号充值。本方案的云资源支持按量付费,且默认设置均采用按量付费引导操作。如果确定任何一个云资源采用按量付费方式部署,账户余额都必须大于等于100元。

一键部署

30

ROS一键部署

  1. 打开一键配置模板链接前往ROS控制台,系统自动打开使用新资源创建资源栈的面板,并在模板内容区域展示YAML文件的详细信息。

    说明

    ROS控制台默认处于您上次访问控制台时所在的地域,请根据您创建的资源所在地域修改地域后再执行下一步。

  2. 确认好地域后,保持页面所有选项不变,单击下一步进入配置模板参数页面。

  3. 配置模板参数页面修改资源栈名称,可用区,配置ECS实例(推荐使用计算型c6,ecs.c6.large)。填写完所有必选信息并确认后单击创建开始一键配置。

  4. 资源栈信息页面的状态显示为创建成功时表示一键配置完成。

    image

  5. 完成资源栈部署后,您需要调用模拟服务的初始化接口导入模拟数据。

    1. 登录ECS管理控制台

    2. 在顶部菜单栏,选择华东1(杭州)地域。

    3. 在左侧导航栏,选择实例与镜像>实例

    4. 部署模拟应用服务。

      1. 实例页面,找到创建的一台ECS实例,在其右侧操作列,单击远程连接

      2. 远程连接对话框的通过Workbench远程连接区域,单击立即登录,然后根据页面提示登录。

      3. 在终端中执行指令

        curl http://localhost:8080/initData?token=AppWithRedis

        如返回值为

        {"success":true,"message":"success","data":""}

        则说明测试数据准备完成。

      4. 登录云数据库RDS控制台,在实例列表页面,找到目标实例,点击实例名称;

      5. 在新页面点击登录数据库,如遇到提示欢迎使用极简模式,可以选择跳过,直接使用。如遇到提示创建DMS服务关联角色,点击确认。如遇到提示实例自动接入开关,默认选择为,可根据需要选择,可以在界面右上角点击实例自动接入:进行配置。

      6. 如出现了登录实例对话框,输入数据库账号(此处为rds)密码(此处为用户设置的密码),管控模式选择自由操作,点击登录

      7. 在SQLConsole窗口中输入

        SELECT * FROM `employee_department` 

        可以看到当前数据库中存在的数据。

完成及清理

20

方案验证

一、缓存验证

完成了一键部署之后,通过ECS实例的公网IP可以访问应用接口,通过不同参数验证方案。

  1. 验证不带缓存的接口

通过浏览器访问http://<ECS公网IP>/getAllEmployeesInDepartment?departmentId=1&cacheFirst=false接口,返回值为:

{
  "success": true,
  "message": "success",
  "data": [
    {
      "id": 1,
      "name": "Alice"
    },
    {
      "id": 2,
      "name": "Ben"
    },
    {
      "id": 3,
      "name": "Charlotte"
    },
    {
      "id": 4,
      "name": "David"
    }
  ]
}
  1. 通过浏览器访问http://<ECS公网IP>/getAllEmployeesInDepartment?departmentId=1&cacheFirst=true接口,返回值与步骤1相同,此时再次访问此接口,返回值为:

{
  "success": true,
  "message": "success from cache",
  "data": [
    {
      "id": 1,
      "name": "Alice"
    },
    {
      "id": 2,
      "name": "Ben"
    },
    {
      "id": 3,
      "name": "Charlotte"
    },
    {
      "id": 4,
      "name": "David"
    }
  ]
}

可见message字段中提示当前数据从缓存中读取。

  1. 验证缓存数据:

    1. 登录云数据库Redis版控制台,在实例列表页面,找到目标实例,点击实例名称;

    2. 在新页面点击登录数据库,如出现了登录实例对话框,输入数据库账号(此处为redis)密码(此处为用户设置的密码),安全托管可以选择不开启,管控模式选择自由操作,点击登录

    3. 在SQLConsole中输入:GET department:1image可以看到执行历史中返回值为接口数据:

      [{"id":1,"name":"Alice"},{"id":2,"name":"Ben"},{"id":3,"name":"Charlotte"},{"id":4,"name":"David"}]

二、数据库压力对比验证

为了进一步验证方案在高并发场景下数据库的压力情况,我们使用负载测试工具 Locust(参考官方文档安装) 进行测试。

  1. 性能测试:无缓存接口

    1. 创建文件locustfile.py,完整代码如下:

      from locust import HttpUser, task, between
      
      class UserBehaviorWithoutCache(HttpUser):
          wait_time = between(1, 5)
      
          @task
          def query_department_without_cache(self):
              self.client.get("/getAllEmployeesInDepartment?departmentId=1&cacheFirst=false")
      
      if __name__ == "__main__":
          import os
          os.system("locust -f <this_script_name>.py")
    2. 在命令行中运行locust启动 Locust。打开浏览器,访问 Locust Web 界面 http://localhost:8089,如图所示填写新的测试参数。image (1)参数说明:

      • Number of users:并发用户数量。

      • Ramp up:即每秒钟增加的用户数量。

      • Host:目标系统的基地址,例如:http://<ECS公网IP>。

    3. 启动测试并执行一段时间后,点击 Stop 停止测试。

    4. 登录云数据库RDS控制台,在实例列表页面,找到目标实例,点击监控。image (2)

  2. 性能测试:缓存接口

    1. 修改locustfile.py代码如下:

      from locust import HttpUser, task, between
      
      class UserBehaviorWithCache(HttpUser):
          wait_time = between(1, 5)
      
          @task
          def query_department_with_cache(self):
              self.client.get("/getAllEmployeesInDepartment?departmentId=1&cacheFirst=true")
      
      if __name__ == "__main__":
          import os
          os.system("locust -f <this_script_name>.py")
    2. 在命令行中运行locust启动 Locust,参考上一步的操作,完成测试,并查看RDS监控。image (3)

  3. 对比分析:

    对比前后两次的数据库监控数据,可以明显看出,在测试无缓存接口时,数据库的流量吞吐量、TPS/QPS、执行次数等指标发生了显著变化,出现了一个处理波峰。而在访问带缓存的接口时,这些指标则更为平滑。具体来看,无缓存访问时的执行次数峰值接近700,而带缓存的情况下则稳定在个位数。这表明缓存机制能够有效缓解数据库的压力。

三、缓存命中验证

  1. 清理数据库中的数据记录:

    1. 登录云数据库RDS控制台,在实例列表页面,找到目标实例,点击实例名称;

    2. 在新页面点击登录数据库,如出现了登录实例对话框,输入数据库账号(此处为rds)密码(此处为用户设置的密码),管控模式选择自由操作,点击登录

    3. 在SQLConsole窗口中输入

DELETE FROM `employee_department` 

执行历史出现提示:

------[执行成功]------
[语句1]:  DELETE FROM `employee_department`
[耗时]: 11 (ms)
[影响行数]: 6

说明数据清理完成。

  1. 访问缓存接口:

    通过浏览器访问http://<公网IP>/getAllEmployeesInDepartment?departmentId=1&cacheFirst=true接口,返回值为:

{
  "success": true,
  "message": "success from cache",
  "data": [
    {
      "id": 1,
      "name": "Alice"
    },
    {
      "id": 2,
      "name": "Ben"
    },
    {
      "id": 3,
      "name": "Charlotte"
    },
    {
      "id": 4,
      "name": "David"
    }
  ]
}

可见 message 字段中提示当前数据从缓存中读取,说明缓存已被正确命中。

清理资源

在本方案中,您创建了1台云服务器ECS实例、1个交换机、1个专有网络VPC、1个云数据库RDS MySQL版实例和1个云数据库Redis版实例。测试完方案后,您可以参考以下规则处理对应产品的实例,避免继续产生费用:

  1. 释放资源栈下的资源,即1台云服务器ECS实例、1个交换机、1个专有网络VPC、1个云数据库RDS MySQL版实例和1个云数据库Redis版实例。

    1. 登录ROS控制台

    2. 在左侧导航栏,选择资源栈

    3. 资源栈页面的顶部选择部署的资源栈所在地域,找到资源栈,然后在其右侧操作列,单击删除

    4. 删除资源栈对话框,选择删除方式释放资源,然后单击确定,根据提示完成资源释放。