后端存储实战课
李玥
美团高级技术专家
44005 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 30 讲
结束语 (1讲)
后端存储实战课
15
15
1.0x
00:00/00:00
登录|注册

02 | 流量大、数据多的商品详情页系统该如何设计?

静态化到商详静态页中
CDN加速服务
存储在对象存储中
存储在MongoDB中
保留商品数据的每一个历史版本
使用Redis作为前置缓存
存储在MySQL中
解决用户下单时商品调价的问题
商品介绍
图片和视频
商品参数
商品基本信息
思考题
商品系统需要保存的数据
商品数据规模问题
高并发问题
商品详情页系统设计

该思维导图由 AI 生成,仅供参考

你好,我是李玥。
今天这节课我们看一下,如何设计一个快速、可靠的存储架构支撑商品系统。
相对于上节课提到的订单系统,电商的商品系统主要功能就是增删改查商品信息,没有很复杂的业务逻辑,支撑的主要页面就是商品详情页(下文简称:商详)。不过,设计这个系统的存储,你仍然需要着重考虑两个方面的问题。
第一,要考虑高并发的问题。不管是什么电商系统,商详页一定是整个系统中 DAU(日均访问次数)最高的页面之一。这个也不难理解,用户购物么,看商详了不一定买,买之前一定会看好多商详货比三家,所以商详的浏览次数要远比系统的其他页面高。如果说,在设计存储的时候,没有考虑到高并发的问题,大促的时候,支撑商详页的商品系统必然是第一个被流量冲垮的系统。
第二,要考虑的是商品数据规模的问题。商详页的数据规模,我总结了六个字,叫:数量多,重量大
先说为什么数量多,国内一线的电商,SKU(直译为:库存单元,在电商行业,你可以直接理解为“商品”)的数量大约在几亿到几十亿这个量级。当然实际上并没有这么多种商品,这里面有很多原因,比如同一个商品它有不同版本型号,再比如,商家为了促销需要,可能会反复上下架同一个商品或者给同一个商品配不同的马甲,这都导致了 SKU 数量爆炸。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

电商商品详情页系统设计需要考虑高并发和大数据量的存储问题。文章首先强调了商详页的高访问量和大数据规模,指出了设计存储系统时需要考虑的两个关键问题。其次,文章提到了商品系统需要保存的数据内容,并介绍了如何存储商品基本信息和商品参数。对于商品基本信息,建议在数据库中建表保存,并在数据库前面加一个缓存来提高读取速度。而对于商品参数,建议使用MongoDB来存储,因为其灵活的表结构可以满足大数据量和不固定属性的存储需求。文章还介绍了如何使用前置缓存来缓存商品数据和MongoDB的特点,以及如何设计商品基本信息表和使用MongoDB保存商品参数。文章总结了电商商品详情页系统设计的关键技术特点,为读者提供了快速了解文章内容的概览。 文章还介绍了使用对象存储保存图片和视频的技术,以及将商品介绍静态化的方法。对象存储可以简单理解为一个无限容量的大文件KV存储,存储单位是对象,可以是图片、视频或其他文件。各大云厂商提供对象存储服务,可以通过客户端API直接访问,实现图片和视频的存储和访问。商品介绍的静态化可以节省服务器资源,利用CDN加速访问速度,同时解决商品价格等信息需要实时更新的问题。 总的来说,商品系统的存储需要提供商品的基本信息、商品参数、图片和视频以及商品介绍等数据。这些数据可以分别保存在MySQL、MongoDB和对象存储中,利用缓存和CDN等技术来提高访问速度和节约带宽。这样的存储架构可以有效应对高并发请求,提升系统性能和用户体验。 文章还提出了思考题,引发读者思考如何解决用户下单时商品调价的问题,为读者提供了思考和交流的空间。整体而言,本文内容丰富,涵盖了电商商品详情页系统设计的关键技术特点,对于技术人员和电商从业者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端存储实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(92)

  • 最新
  • 精选
  • 李玥
    置顶
    hi,我是李玥。跟上节课一样,我还是在留言板上同步一下上节课的思考题,大家一起来学习探讨。 上节课我们讲了两种实现幂等的方法,课后呢,我也让你思考了下,在你负责开发的业务系统中,能不能用这节课中讲到的方法来实现幂等?除了这两种方法以外,还有哪些实现服务幂等的方法? 关于这个问题,我是这么看的。 其实总结下来这些实现幂等的方法,无非是两大类,一类是通过一些精巧的设计让更新本身就是幂等的,这种需要点儿运气,不是所有业务都适用的。另外,就是利用外部的、具备一致性的存储(比如说MySQL)来做冲突检测,你在设计幂等方法的时候一般都可以顺着这两个思路来开展。
    2020-02-26
    2
    67
  • 老姜
    mysql支持json数据类型了,是不是可以不用mongodb了,多一个数据库,系统就会更复杂

    作者回复: 是的,如果能满足业务需求的话,尽量不要用太多的技术。

    2020-02-27
    8
    59
  • 漏脚脖
    老师你好,商品介绍静态化的地方不太懂想请教一下 我们公司现在的做饭是前端页面直接通过ajax请求数据,我理解的是静态化之后,商品介绍这部分就不用请求接口了,那这部分数据也需要初始化吧? 所以,我的第1个问题是,商品介绍这部分数据是怎么初始化的呢?难道是初始化到html文件里吗?我的第1个问题是,商品介绍这部分数据是怎么初始化的呢?难道是初始化到html文件里吗? 第2个问题,如果问题1成立,那是不是没个商品的介绍都要写到一个html文件里?那几亿个sku怎么做呢,要几亿个html?不太可能吧 这块老师能展开说一下吗,不太懂具体的实现

    作者回复: 第一个问题,初始化的方式一般就是在商家后台修改了商详页中的商品介绍之后,重新生成一个该SKU的新的商详页HTML文件,这个HTML文件的内容直接就包含商品介绍等大段的文字。然后把这个HTML推送到CDN上,或者等CDN回源来拉取。 第二个问题,是的,每个SKU就会生成一个HTML。 对于像京东淘宝这样的超大规模电商,它们的做法又不一样了,它们的商详页会被划分得非常细,可能会被分为几十上甚至百部分内容,每一部分可能是静态化的HTML片段,也可能是走的缓存,或者是动态生成的,取决于后面支撑这一小块儿内容的系统了。

    2020-02-27
    15
    40
  • 蹦~沙卡拉卡
    老师,我问下,商品每次变化都要保存一个快照。 假如商品表是table_a, 快照表是table_b, 那么订单关联的商品是关联 商品表 table_a 还是 快照表 table_b呢? 我的理解是关联快照表。

    作者回复: 是的,关联快照。

    2020-03-24
    20
  • 何妨
    希望老师可以再展开讲讲商品介绍静态化这一块,有些意犹未尽,还是想详细了解一下,感觉看到了些门道但还是有些模糊

    作者回复: 其实静态化都是“过时”的技术了。但是特定的场景还是非常有用。 现在的动态Web页面,都是用JS请求动态数据,在浏览器中填充内容。 早期的Web页都是Server端渲染,比如Java中的thymeleaf,FreeMarker 模板引擎,包括PHP本身就是个模板引擎,这些都是在服务端来填充好动态内容,再返回给浏览器的。 页面静态化就是利用这些模板引擎技术,事先就把页面中的动态内容填充好,生成一个一个静态的HTML。 这种静态化技术只适合页面内容很多,页面又不会经常变化的场景。比如我们电商的商详页,再比如很多新闻、咨询类的网站(一篇新闻发了之后很少会修改)。

    2020-02-28
    8
    18
  • MadDog
    请问elasticSearch可以替换mongoDB嘛?elasticSearch也可以通过Dynamic field mappings做到类似功能

    作者回复: 从动态字段这个功能上说,这俩数据库是可以互相替换的,哪个更好还是要看业务需求。 大多数场景下mongo写性能更好一些,ES更容易维护,功能也更丰富,但也有一些缺陷,比如深分页的问题,SQL支持还不是特别完善等等。 个人认为ES的前景更好一些,大家怎么看?

    2020-02-27
    11
    18
  • 萨秋
    老师您好 想请问下静态化这块 如何做seo优化呢 类似于价格等信息都是爬虫主要抓取的 如果做成异步的话数据源就会有缺失 类似这样的问题

    作者回复: 做SEO还是主要提供商品内容,很多电商都不希望价格被抓走,还要做各种措施来防止爬虫抓取价格。

    2020-03-17
    6
  • 大秦皇朝
    李玥老师您好: 上传了图片和视频后,但是又没有提交数据,那么服务器上是否会出现没有用的冗余/垃圾数据?那这块怎么判断和处理呢?

    作者回复: 确实可能有这种情况。 没精力的话可以不管,反正垃圾数据也不太多,存储也便宜。 等积累到一定量了,再写个任务定期清理一下就可以。

    2020-03-04
    3
    6
  • kamida
    老师 商品历史版本是在建一个单独的商品历史表 然后给它对于一个时间列吗

    作者回复: 一般都是用版本号对应的。

    2020-03-23
    3
  • hhhh
    老师想请教下,在存储商品参数的场景,用mysql的json类型存储与mongo, 如何做一下简单的权衡?不胜感激。

    作者回复: 存储的选择没有谁好谁不好,还是看场景和需求。 如果只是单纯的存商品参数,MongoDB这种文档数据库更专业一些。 如果从统一技术栈来考虑,使用MySQL JSON能满足需求的话,也是可以的。

    2020-02-29
    3
收起评论
显示
设置
留言
92
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部