当前位置: 首页 > news >正文

淘宝的商品信息缓存体系是如何构建的?

0 前言

在电商系统中,商品信息的快速获取对用户体验至关重要。本文将详细讲解一个多层级的商品信息缓存体系,旨在提高系统性能和可靠性。

开局一张图,剩下全靠编!

1 整体架构

该缓存体系采用了多级缓存策略,从前端到后端,逐层深入:

  1. CDN缓存
  2. Nginx缓存集群
  3. Redis缓存
  4. JVM本地缓存
  5. MySQL持久化存储

2 详细解析

1. 用户请求入口

用户的请求首先通过CDN(内容分发网络):

User -> CDN -> 前端静态资源 (Front-end Static Resources)

CDN负责分发静态资源,减轻主服务器负载。

2. 负载均衡

请求经过CDN后,进入负载均衡层:

CDN -> LVS (Linux Virtual Server) + HA Proxy
  • LVS: 实现高性能、高可用的负载均衡
  • HA Proxy: 提供更细粒度的流量控制和健康检查

3. Nginx边缘节点

LVS + HA Proxy -> JavaEdge (Nginx转发层)

JavaEdge是一个Nginx集群,负责请求的初步处理和转发。这里可能进行:

  • IP限流和转发
  • 业务判断(解析URL)

4. Nginx业务层

JavaEdge将请求转发到Nginx业务层:

JavaEdge -> 单品页Nginx / 结算Nginx

这一层的Nginx服务器针对不同的业务场景(如单品页、结算页)进行了优化。

5. Lua脚本和Redis缓存

在Nginx业务层,使用Lua脚本实现了与Redis的交互:

Nginx业务层 -> Lua -> Redis

Lua脚本在Nginx中执行,直接从Redis读取缓存数据,实现高效的数据获取。

6. JVM缓存

如果Redis中没有所需数据,请求会转发到Java应用服务器:

Redis (未命中) -> JVM Cache

JVM缓存作为本地缓存,可以进一步提高数据访问速度。

7. MySQL持久化

作为最后的数据源,MySQL存储所有的商品信息:

JVM Cache (未命中) -> MySQL

当缓存未命中时,系统会查询MySQL,并更新各级缓存。

3 缓存层级

图中展示了五个缓存层级:

  1. 一级缓存:可能指CDN或浏览器缓存
  2. 二级缓存:Nginx层的缓存
  3. 三级缓存:Redis缓存
  4. 四级缓存:JVM本地缓存
  5. 五级缓存:MySQL(作为最终数据源)

4 特殊说明

  1. Nginx本地缓存:用于存储热点数据,提高访问速度。
  2. Redis主从同步:确保Redis数据的高可用性。
  3. JVM Cache到Redis的更新:保证数据一致性。

5 总结

这个多层级的缓存体系通过合理利用各种缓存技术,实现了高效的商品信息获取。从前端到后端,逐层深入,每一层都在努力提供最快的响应。这种架构不仅提高了系统性能,还增强了系统的可靠性和扩展性。

在实际应用中,还需要考虑缓存一致性、过期策略、热点数据处理等问题,以构建一个完善的商品信息缓存体系。

关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。

各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

  • 中央/分销预订系统性能优化

  • 活动&券等营销中台建设

  • 交易平台及数据中台等架构和开发设计

  • 车联网核心平台-物联网连接平台、大数据平台架构设计及优化

  • LLM Agent应用开发

  • 区块链应用开发

    目前主攻市级软件项目设计、构建服务全社会的应用系统。

参考:

  • 编程严选网

    本文由博客一文多发平台 OpenWrite 发布!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于多种机器学习的豆瓣电影评分预测与多维度可视化【可加系统】
  • 孟德尔随机化、R语言,报错,如何解决?
  • 【达梦数据库】通过线程pid定位会话SQL
  • Python——继承
  • vue2学习 -- 核心语法
  • 2024下半年,前端的技术风口来了
  • 【保姆级讲解下QT6.3】
  • JavaScript 实现通话计时(时分秒 本示例在uniapp中)
  • 2024小卷Spring Boot3.0教程思维导图整理
  • python np.max怎么用
  • 代码随想录算法训练营第41天|LeetCode 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
  • 多进程编程思维导图
  • 06 定时器和PWM(1)
  • OD C卷 - 最多购买宝石数目
  • DBMS-1.2 关系运算
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【译】理解JavaScript:new 关键字
  • HTTP请求重发
  • node入门
  • Objective-C 中关联引用的概念
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Spring Boot快速入门(一):Hello Spring Boot
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 免费小说阅读小程序
  • 前端代码风格自动化系列(二)之Commitlint
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 数据科学 第 3 章 11 字符串处理
  • 我这样减少了26.5M Java内存!
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一) springboot详细介绍
  • (一)RocketMQ初步认识
  • (一)u-boot-nand.bin的下载
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .gitignore不生效的解决方案
  • .jks文件(JAVA KeyStore)
  • .net 4.0发布后不能正常显示图片问题
  • .NET C# 配置 Options
  • .NET Standard 的管理策略
  • .NET 分布式技术比较
  • .Net 高效开发之不可错过的实用工具
  • .NetCore发布到IIS
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • ::前边啥也没有