《去哪儿网Redis高并发实战:从问题定位到架构升级》

去哪儿网Redis高并发实战:从问题定位到架构升级

在互联网行业竞争日益激烈的当下,高并发场景下的系统性能优化一直是技术团队面临的重要挑战。对于去哪儿网这类在线旅游平台来说,节假日期间的流量高峰更是对系统架构的严峻考验。本文将深入剖析去哪儿网在五一假期期间,针对Redis高并发问题的实战解决方案,从问题定位、优化策略到架构升级,全方位展现整个优化过程。

一、案例背景:五一假期流量峰值挑战

1.1 业务场景

去哪儿网作为国内领先的在线旅游平台,提供机票预订、酒店预订、旅游攻略等多种服务。在五一假期这样的旅游旺季,平台的业务流量呈现爆发式增长。其中,机票搜索、酒店推荐等核心接口的日请求量突破5亿大关,支撑这些业务的Redis集群QPS(每秒查询率)更是达到了惊人的80万。如此庞大的访问量,对Redis集群的性能和稳定性提出了极高的要求。

在机票搜索业务中,用户频繁查询航线价格日历,这使得与价格日历相关的Redis key访问量极为集中;酒店推荐接口则需要快速获取酒店的各类信息,同样依赖Redis缓存来提升响应速度。Redis作为内存数据库,凭借其高性能、高并发的特点,成为了去哪儿网缓存数据的首选方案,但在极端流量下,也暴露出了一系列问题。

1.2 核心问题

随着流量的持续攀升,Redis集群出现了严重的性能瓶颈。首先,热点航线价格日历key的访问过于集中,导致承载这些key的单节点CPU使用率飙升至90%。过高的CPU负载使得该节点处理请求的能力大幅下降,不仅影响了自身的响应速度,还可能导致整个集群的性能波动。

其次,缓存雪崩问题给系统带来了巨大压力。由于大量缓存数据同时过期,瞬间产生的大量请求无法从Redis获取数据,只能回源到数据库(DB)。DB回源QPS超过4000,远超其正常承载能力,接口响应时间也从正常的几十毫秒延长至500ms以上,用户体验急剧下降。如果不及时解决这些问题,可能会导致用户流失,对业务造成严重影响。

二、问题定位与分析

2.1 热点key识别

为了找出导致单节点CPU过高的原因,技术团队首先进行了热点key的识别。通过使用redis-cli --bigkeys命令,对Redis集群中的key进行扫描分析。该命令能够快速找出占用内存较大的key以及访问频率较高的key。

经过扫描发现,像flight:price:calendar:CN-SHA这样与热点航线价格日历相关的key,其访问占比超过了30%。这些热点key的集中访问,使得负责存储它们的Redis节点负载过重,成为了系统性能的瓶颈。

2.2 慢查询分析

除了热点key问题,慢查询也是影响Redis性能的重要因素。去哪儿网技术团队开启了Redis的慢查询日志功能,对执行时间较长的命令进行分析。分析结果显示,大量的HGETALL操作耗时超过10ms,而Redis是单线程模型,这些耗时较长的操作会阻塞其他请求的执行,导致整体响应速度变慢。

HGETALL命令用于获取哈希表中的所有字段和值,在实际业务中,可能并不需要一次性获取所有数据,这种过度的数据获取方式不仅浪费了资源,还降低了系统的并发处理能力。

三、优化策略与实施

3.1 热key多副本拆分

针对热点key访问集中的问题,去哪儿网采用了热key多副本拆分的策略。以flight:price:calendar:CN-SHA这个热点key为例,将其拆分为10个副本,分别命名为flight:price:calendar:CN-SHA:0flight:price:calendar:CN-SHA:9

在客户端访问时,通过hash(userId) % 10的方式,将用户请求随机分配到这10个副本上。这样一来,原本集中在一个节点上的流量就被分散到了10个节点,有效降低了单个节点的负载压力。通过这种方式,不仅提升了系统的并发处理能力,还增强了系统的稳定性。

客户端请求
计算hash userId % 10
访问flight:price:calendar:CN-SHA:0
访问flight:price:calendar:CN-SHA:1
访问flight:price:calendar:CN-SHA:2
访问flight:price:calendar:CN-SHA:3
访问flight:price:calendar:CN-SHA:4
访问flight:price:calendar:CN-SHA:5
访问flight:price:calendar:CN-SHA:6
访问flight:price:calendar:CN-SHA:7
访问flight:price:calendar:CN-SHA:8
访问flight:price:calendar:CN-SHA:9

3.2 逻辑过期+异步刷新

为了解决缓存雪崩问题,去哪儿网引入了逻辑过期+异步刷新的机制。在缓存数据结构中新增logical_expire_time字段,用于记录数据的逻辑过期时间,同时将物理TTL(生存时间)设置为24小时。

当系统检测到logical_expire_time < now时,并不会立即阻塞请求去更新数据,而是触发一个异步任务来刷新数据。在异步任务刷新数据的过程中,请求仍然可以获取到旧数据,这样就避免了大量请求同时回源到数据库,有效防止了缓存雪崩的发生。通过这种方式,保证了系统在缓存数据更新过程中的高可用性和稳定性。

请求访问缓存
logical_expire_time < now?
触发异步任务刷新数据
返回缓存数据
异步获取新数据
更新缓存数据

3.3 本地缓存前置

为了进一步减少对Redis的访问量,去哪儿网在客户端引入了本地缓存。选用Caffeine作为本地缓存框架,对热门航线数据进行缓存,设置TTL为10分钟。Caffeine具有高性能、低内存占用等特点,非常适合在客户端使用。

通过引入本地缓存,大量对热门航线数据的请求可以直接从本地缓存中获取,命中率达到了85%。这不仅减轻了Redis集群的压力,还显著提升了接口的响应速度,为用户提供了更好的使用体验。

客户端请求
本地缓存是否命中?
返回本地缓存数据
访问Redis
获取数据并更新本地缓存
返回数据

四、架构升级与监控完善

4.1 集群拆分

随着业务的不断发展,Redis集群中的资源竞争问题日益突出。为了解决这一问题,去哪儿网对Redis集群进行了拆分,按照业务维度将其拆分为机票、酒店、攻略3个Cluster集群。

通过集群拆分,不同业务的数据存储在不同的集群中,避免了资源的相互竞争。例如,机票业务的流量不会影响到酒店业务的性能,每个集群可以根据自身业务的特点进行针对性的优化和扩展。这种架构设计不仅提升了系统的性能,还增强了系统的可维护性和扩展性。

4.2 监控体系建设

为了及时发现和解决系统中出现的问题,去哪儿网构建了完善的监控体系,选用Prometheus作为监控工具。Prometheus能够实时采集和存储Redis集群的各项指标数据,并提供强大的查询和告警功能。

监控的关键指标包括QPS、命中率、慢查询数、内存使用率等。通过对这些指标的实时监控,技术团队可以及时了解Redis集群的运行状态。同时,设置了告警规则,当CPU使用率超过80%、命中率低于70%时,系统会自动触发告警,通知相关人员进行处理。这样一来,能够在问题发生的第一时间做出响应,保障系统的稳定运行。

4.3 大key治理

大key不仅会占用大量的内存空间,还会影响Redis的性能。去哪儿网制定了大key治理方案,定期对Redis中的大key进行扫描。对于像粉丝列表等数据量大的key,将其拆分为多个子key,确保每个key的大小不超过1MB。

通过大key治理,减少了内存碎片的产生,提高了内存的利用率,同时也降低了大key对系统性能的影响,进一步提升了Redis集群的整体性能。

五、优化效果对比

经过一系列的优化和架构升级,去哪儿网Redis集群的性能得到了显著提升。以下是优化前后各项指标的对比:

指标优化前优化后
单节点CPU峰值90%35%
缓存命中率68%96.5%
DB回源QPS4200380
接口响应时间320ms65ms

从数据可以看出,单节点CPU峰值从90%下降到35%,有效解决了热点key导致的CPU过高问题;缓存命中率从68%提升到96.5%,大幅减少了对数据库的访问;DB回源QPS从4200降至380,极大减轻了数据库的压力;接口响应时间从320ms缩短至65ms,显著提升了用户体验。

六、总结与展望

去哪儿网在Redis高并发实战中的优化经验,为其他面临类似问题的互联网企业提供了宝贵的参考。通过热点key多副本拆分、逻辑过期+异步刷新、本地缓存前置等优化策略,以及集群拆分、监控体系建设、大key治理等架构升级措施,成功解决了五一假期流量峰值下的性能瓶颈问题。

未来,随着业务的持续增长和用户需求的不断变化,去哪儿网将继续关注Redis技术的发展,探索更多优化方案和架构创新,进一步提升系统的性能和稳定性,为用户提供更加优质的服务。同时,也会将这些实践经验应用到更多的业务场景中,推动整个技术团队的能力提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910477.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zynq + FreeRTOS + YAFFS2 + SQLite3 集成指南

Zynq FreeRTOS YAFFS2 SQLite3 集成指南 一、系统架构设计 #mermaid-svg-qvuP6slyza89wsiT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qvuP6slyza89wsiT .error-icon{fill:#552222;}#mermaid-svg-qvuP6slyz…

设计模式精讲 Day 6:适配器模式(Adapter Pattern)

【设计模式精讲 Day 6】适配器模式&#xff08;Adapter Pattern&#xff09; 文章内容 在“设计模式精讲”系列的第6天&#xff0c;我们将深入讲解适配器模式&#xff08;Adapter Pattern&#xff09;。作为结构型设计模式之一&#xff0c;适配器模式的核心思想是将一个类的接…

系统稳定性治理

一、微服务内部异常 描述 微服务Pod自动重启表现&#xff1a;服务波动&#xff08;响应时间不稳定&#xff09;、监控指标异常&#xff08;Pod重启次数增加&#xff0c;CPU/内存波动&#xff09;、Kubernetes事件记录容器重启原因影响&#xff1a;服务中断、性能波动、资源消耗…

多智能体协同的力量:赋能AI安全报告系统的智能设计之道

“设想一个由‘数据采集者’、‘风险分析师’、‘报告撰写员’甚至‘合规监督员’组成的虚拟团队&#xff0c;它们如何携手打造一份深度洞察、精准预警的危化安全报告&#xff1f;这正是多智能体协作在AI安全领域的魅力所在。” 一、挑战升级&#xff1a;单一AI难以应对的复杂性…

ceph pg 卡在 active+clean+remapped 状态

场景 ceph 环境中有个 osd.0 做了 raid0 ,后来想剔除掉,执行了 ceph osd out 0 然后等了很长时间等 pg 数据迁移到别的 osd,但是最后有一个 pg 状态卡在了 active+clean+remapped 状态。如下: ceph pg ls-by-osd 0 PG OBJECTS DEGRADED MISPLACED UNFOUND BYTES …

systemd[1]: Failed to start LSB: Bring up/down networking

使用ssh连接虚拟机服务时&#xff0c;连接异常&#xff0c;虚拟机系统centos 7&#xff0c;于是登录虚拟机&#xff0c;查看服务ip&#xff0c;发现配置的静态ip未生效。因此重启网卡systemctl restart network&#xff0c;出现报错&#xff0c;使用systemctl status network查…

Go 语言使用 excelize 库操作 Excel 的方法

在笔者开发的项目中&#xff0c;有操作excel的需要&#xff0c;由于go操作excel比较方便且功能强大&#xff0c;于是选择使用go来操作excel。github.com/360EntSecGroup-Skylar/excelize库是一个功能强大且易于使用的库&#xff0c;它支持创建、读取和修改 Excel 文件&#xff…

Java基础(三):逻辑运算符详解

Java基础系列文章 Java基础(一)&#xff1a;发展史、技术体系与JDK环境配置详解 Java基础(二)&#xff1a;八种基本数据类型详解 Java基础(三)&#xff1a;逻辑运算符详解 目录 一、什么是逻辑运算符&#xff1f;二、基础逻辑运算符&#xff08;3种&#xff09;1、&&…

Bugku-CTF-web

最近刷了一下 Bugku-CTF-web 的61-70题&#xff08;平台目前只有67&#xff09;&#xff0c;好难好难&#xff0c;全都是知识的盲区。各种代码审计&#xff0c;各种反序列化&#xff0c;各种反弹shell&#xff0c;各种模版注入&#xff0c;各种字符串绕过&#xff0c;可以说是W…

GitLab 工具如何提升我的工作效率

在当今快节奏的软件开发和技术创作领域&#xff0c;作为一名博主&#xff0c;高效的工作流程和强大的协作工具至关重要。GitLab 作为一款集成了版本控制、项目管理、持续集成与持续部署&#xff08;CI/CD&#xff09;等功能于一体的平台&#xff0c;为我的工作带来了巨大的便利…

Unity Addressable使用之服务器远程加载

本地模拟服务器加载 1、创建一个Profiles&#xff0c;将Remote设为Editor Hosted 2、在Addressables Group窗口将Profile设为Local Test 3、将某个Asset Groups设为Remote加载 4、Build资源 5、打开本地模拟服务器 Addressables Hosting 窗口是 Addressable 提供的一个内置本…

Java基础八股文 - 面试者心理历程与标准答案

Java基础八股文 - 面试者心理历程与标准答案 前言&#xff1a;如何应对Java基础面试问题 面试Java基础时&#xff0c;很多候选人会因为紧张而忘记平时熟悉的知识点。本文将从面试者的心理历程出发&#xff0c;教你如何在面试中用自己的思路组织答案&#xff0c;然后给出标准回…

学习笔记088——Windows配置Tomcat自启

1、下载 下载Windows版本tomcat。本文下载的版本是&#xff1a; apache-tomcat-9.0.31-windows-x64.zip 点击下载 注意&#xff1a;要确保bin目录下有 service.bat 文件&#xff01; 2、配置服务 解压后&#xff0c;终端进入bin⽬录&#xff0c;安装服务&#xff1a;service…

SSL证书怎么配置到服务器上 ?

在网络安全备受关注的当下&#xff0c;SSL证书已成为网站安全的标配。但仅有SSL证书还不够&#xff0c;正确将其配置到服务器上&#xff0c;才能真正发挥保障数据传输安全、验证网站身份的作用。由于服务器类型多样&#xff0c;不同服务器的SSL证书配置方法存在差异&#xff0c…

AI与SEO关键词协同进化

内容概要 人工智能&#xff08;AI&#xff09;与搜索引擎优化&#xff08;SEO&#xff09;的结合&#xff0c;正深刻变革着关键词策略的制定与执行方式。本文旨在探讨AI技术如何驱动SEO关键词领域的智能化进化&#xff0c;核心在于利用AI强大的数据处理与模式识别能力&#xf…

01.线性代数是如何将复杂的数据结构转化为可计算的数学问题,这个过程是如何进行的

将复杂数据结构转化为可计算的数学问题是数据科学、机器学习和算法设计中的核心环节。这一过程需要结合数据特性、数学理论和计算框架,通过系统化的抽象和建模实现。以下是具体转化流程及关键技术解析: 一、数据结构分析:解构原始数据的本质特征 1. 识别数据类型与结构特性…

华为OD机考-网上商城优惠活动-模拟(JAVA 2025B卷)

import java.util.Scanner;public class Test3 {static int mjq;static int dzq;static int wmkq;static class Group {int price;// 打折后价格int num;// 优惠券使用熟练}public static void main(String[] args) {Scanner scanner new Scanner(System.in);String input sc…

JavaScript 数据处理 - 将字符串按指定位数截断并放入数组(基础实现、使用正则表达式实现、使用正则表达式简化实现)

将字符串按指定位数截断并放入数组 1、基础实现 /*** 将字符串按指定位数截断并放入数组* param {string} str - 要处理的字符串* param {number} n - 每段截断的位数* returns {Array} 截断后的字符串数组*/ function splitStringByLength(str, n) {const result [];for (l…

python学智能算法(十四)|机器学习朴素贝叶斯方法进阶-CountVectorizer文本处理简单测试

【1】引用 前序学习文章中&#xff0c;已经对拉普拉斯平滑和简单二元分类进行了初步探索&#xff0c;相关文章链接为&#xff1a; python学智能算法&#xff08;十二&#xff09;|机器学习朴素贝叶斯方法初步-拉普拉斯平滑计算条件概率-CSDN博客 python学智能算法&#xff0…

Java枚举类的规范设计与常见错误规避

前言 在Java开发中&#xff0c;枚举&#xff08;enum&#xff09;是一种强大的工具&#xff0c;用于定义一组固定常量集合。然而&#xff0c;许多开发者在使用枚举时容易陷入设计误区&#xff0c;导致代码可维护性差、运行时错误频发&#xff0c;甚至引发生产事故。 一、枚举…