用Tair缓存加速应用,轻松应对高并发

使用阿里云Tair缓存,提升应用性能,轻松应对高并发场景,让你的应用飞起来!

原文标题:缓存加速新玩法,让你的应用飞起来

原文作者:阿里云开发者

冷月清谈:

本文介绍了如何使用阿里云的Tair数据库构建缓存,提升应用性能,特别是针对高并发场景。Tair兼容Redis协议,具有高性能、高可用性、弹性伸缩等优势,支持多种数据结构。文章通过对比有无缓存的接口访问,以及使用Locust进行负载测试,展示了Tair缓存对数据库压力和响应速度的提升效果。文中详细讲解了如何搭建测试环境以及验证缓存命中情况,并提供了代码示例。

怜星夜思:

1、除了Tair,还有哪些缓存方案可以结合阿里云产品使用?各自的优缺点是什么?
2、文章中提到了Locust进行性能测试,实际操作中如何选择合适的性能测试工具和指标?
3、如何保证缓存数据和数据库数据的一致性?

原文内容

阿里妹导读


本文主要叙述如何运用云数据库 Tair 构建缓存,助力应用提速、优化性能。

一、引言

随着业务的不断发展,应用系统面临的流量压力日益增大。如何在高并发场景下降低系统响应时间、提升整体性能,成为每一位开发人员需要攻克的关键课题。使用缓存,无疑是解决这一问题的首选方案。今天,我们为您介绍如何运用云数据库 Tair 构建缓存,助力应用提速、优化性能。

为什么选择云数据库 Tair 构建缓存?

缓存是一种数据存储机制,通过在高速存储介质中暂存频繁请求的数据,减少对主存储或数据库的直接访问,从而提高系统性能和响应速度。根据应用需求、数据特性和系统架构的不同,构建缓存的方式也是灵活多样。云数据库 Tair 是兼容开源 Redis 协议标准的数据库服务,适用于缓存、实时流数据处理等场景,具有稳定可靠、弹性扩展、易用高效等特点,并支持多种数据结构和高级功能。

核心优势:

  • 高性能存储服务:提供了高性能的键值存储服务,可以满足各种业务场景的需求。采用多线程模型,读写性能达到同规格云数据库 Redis 社区版实例的数倍,能够有效地提高应用的响应速度。
  • 高可用性和弹性伸缩:基于双机热备架构及集群架构,支持自动扩容,提供多种高可用方案,可以根据业务需求动态调整实例规格和容量,帮助您快速弹性适配业务高峰,避免内存溢出的风险,有效保障线上业务稳定性。
  • 丰富数据类型支持:提供丰富的自研增强型数据结构,包括 exString(包含Redis String 命令增强)、exHash、exZset、GIS、Bloom、Doc、TS、Cpc、Roaring、Search 和Vector,帮助您精简代码并提高业务整体性能。

点击文末“阅读原文”,了解更多详情,参与活动更有精美礼品等您来拿!

二、方案展示

1. 通过对比访问带缓存与不带缓存的接口,验证缓存功能

通过ECS实例的公网IP访问应用接口,通过不同参数验证方案。

验证不带缓存的接口

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

通过浏览器访问

http://<ECS公网IP>/getAllEmployeesInDepartment?departmentId=1&cacheFirst=true接口,此时再次访问此接口,返回值为:
可见message字段中提示当前数据从缓存中读取。

验证缓存数据:

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

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

iii. 在SQLConsole中输入:GET department:1

可以看到执行历史中返回值为接口数据:
图片
2. 通过Locust性能测试,验证缓存减轻数据库压力
为了进一步验证方案在高并发场景下数据库的压力情况,我们使用负载测试工具 Locust(参考官方文档安装) 进行测试。

性能测试:无缓存接口

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

ii. 在命令行中运行locust启动 Locust。

打开浏览器,访问 Locust Web 界面 http://localhost:8089,如图所示填写新的测试参数。

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

  • Ramp up:即每秒钟增加的用户数量。
  • Host:目标系统的基地址,例如:http://<ECS公网IP>。

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

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

性能测试:缓存接口

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

ii. 在命令行中运行locust启动 Locust,参考上一步的操作,完成测试,并查看RDS监控。

对比分析:

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

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

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

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

iii. 在SQLConsole窗口中输入

图片

当执行历史出现提示:

说明数据清理完成。

访问缓存接口:

通过浏览器访问http://<公网IP>/getAllEmployeesInDepartment?departmentId=1&cacheFirst=true接口,返回值为:
可见 message 字段中提示当前数据从缓存中读取,说明缓存已被正确命中。

点击阅读原文,体验运用高性能的云数据库 Tair 构建缓存为应用提速~

性能测试工具的选择和指标的确定其实是一个不断尝试和优化的过程,没有一成不变的标准答案。可以先从简单的工具和指标入手,逐步深入,根据测试结果不断调整测试方案。

除了文中提到的工具,还可以考虑Gatling、k6等。选择工具时可以考虑学习成本、社区活跃度、是否支持分布式测试等因素。指标方面,除了常见的吞吐量和响应时间,还需要关注CPU、内存、磁盘IO等系统资源的使用情况。

保证缓存数据和数据库数据的一致性是一个比较复杂的问题,常见的方案有:1. 延迟双删;2. 基于消息队列的同步机制;3. 使用canal监听数据库binlog进行同步等等。 这些方案各有优缺点,需要根据具体的业务场景选择合适的方案。

阿里云还有自建Redis和Memcached的云服务,使用起来更加便捷,可以省去自己搭建和维护的麻烦。另外,还可以考虑使用OSS作为缓存,存储一些静态资源,比如图片、视频等,减轻服务器压力。

可以考虑使用数据库自带的缓存同步机制,比如Redis的缓存同步功能,或者使用一些开源的缓存同步工具。不过,需要注意的是,缓存同步机制会增加系统复杂度,需要谨慎使用。

其实选择哪种缓存方案没有绝对的优劣,关键在于是否适合你的应用场景。比如,如果你的数据量比较小,对性能要求不高,那么使用本地缓存Ehcache就足够了。如果你的数据量比较大,对性能要求比较高,那么就需要考虑使用Redis或Tair等分布式缓存方案。

选择性能测试工具需要根据实际情况来定。Locust适用于模拟大量用户并发访问,JMeter功能更全面,可以模拟更复杂的场景,ab则比较轻量级,适合快速测试。指标方面,需要关注吞吐量、响应时间、错误率等,结合业务需求来判断。

除了Tair,还可以选择Redis、Memcached,甚至本地缓存Ehcache等。Redis功能丰富,支持多种数据结构,性能也很高,适合复杂缓存场景;Memcached简单易用,性能极致,适合kv存储;Ehcache作为本地缓存,速度最快,但受限于单机内存。选择哪种方案需要根据实际业务场景和需求进行权衡。

对于一致性要求不是特别高的场景,可以采用最终一致性策略,即允许缓存数据和数据库数据在一段时间内存在不一致的情况,通过定时任务或者异步任务将缓存数据同步到数据库。