JD亿级流量电商平台商品模块业务与技术详解实战
前言:
各位老铁们好,今天2B哥给大伙来介绍下平常咱们逛京东时候打开商品详细页其中实现的技术。是不是很吊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
看2B哥的商品图是不是更吊,最近在家办公,除了写代码就疯狂用它了。
大家不要笑,其实商品中心里技术难度有二:
一、商品搜索
二、商品详细页
今天和大家重点讲商品详细页(商品搜索也想学可以看文章末尾福利)。
商品中心业务:
一件商品从他发布到下架大致流程:
商品分类+商品(1对多)
t_catalog商品分类表
参数 | 名称 | 类型 | 备注 |
---|---|---|---|
id | 自增长 | int | 唯一 |
name | 分类名称 | String | |
code | 编码,简码 | String | 唯一 |
pid | 父ID | Int | ~~ ~~ |
order1 | 排序 | Int | |
type | 类型 | String | 类型,a:文章目录;p:产品目录 |
showInNav | 是否显示在首页的导航条上 | String | y:显示,n:不显示;默认n。仅对type=p有效 |
t_product商品表
字段名 | 数据类型 | 默认值 | 描述 |
---|---|---|---|
id | int | 唯一,商品ID | |
catalogID | varchar | 商品类别catalog表id | |
name | varchar | 商品名称 | |
introduce | text | 商品简介 | |
price | DECIMAL(9,2) | 定价 | |
nowPrice | DECIMAL(9,2) | 现价 | |
picture | String | 小图片地址 | |
score | Int | 0 | 赠送积分 |
maxPicture | String | ~~ ~~ | 大图片地址 |
isnew | String | n | 是否新品。n:否,y:是 |
sale | String | n | 是否特价。n:否,y:是 |
activityID | String | 绑定的活动ID | |
giftID | String | 绑定的礼品ID | |
hit | int | 0 | 浏览次数 |
unit | String | 商品单位。默认“item:件” | |
createAccount | String | 录入人账号 | |
createtime | datetime | 录入时间 | |
updateAccount | String | 最后修改人账号 | |
updatetime | String | 最后修改时间 | |
isTimePromotion | String | n | 是否限时促销。n:否,y:是 |
status | Int | 0 | 商品状态。1:新增,2:已上架,3:已下架 |
productHTML | LONGTEXT | 商品介绍 | |
images | String | 商品多张图片集合,逗号分割 | |
sellcount | Int | 销售数量 | 默认:0 |
stock | Int | 剩余库存数 | 默认:0 |
searchKey | String | 搜索关键词 | |
title | String | 页面标题 | |
description | String | 页面描述 | |
keywords | String | 页面关键词 |
分类+商品+品牌:
我要查看苹果所有的产品(手机苹果、电脑苹果)需求
分类+商品+品牌+属性:
更加快速找到我们想购买的商品
t_attribute商品属性(参数)表
参数 | 名称 | 类型 | 备注 |
---|---|---|---|
id | 自增长 | int | 唯一 |
name | 属性/参数名称 | String | |
catalogID | 类别ID | Int | |
pid | 父ID | Int | 该字段具有双重含义。0表示属性大类,一般情况下产品只有两层attribute,一层为属性名称类别,一层为属性;-1:参数 |
order1 | 排序 | Int |
t_attribute_link商品属性(参数)中间表
参数 | 名称 | 类型 | 备注 |
---|---|---|---|
id | 自增长 | int | 唯一 |
attrID | 属性(参数)ID | Int | |
productID | 商品ID | Int | |
value | 商品参数值 | String | 名称从属性表中取得 |
分类+商品+品牌+属性+规格:
t_spec商品规格表
字段名 | 数据类型 | 默认值 | 描述 |
---|---|---|---|
id | int | 唯一 | |
productID | String | 商品ID | |
specColor | String | 颜色 | |
specSize | String | 尺寸 | |
specStock | Int | 此规格的商品库存数 | |
specPrice | Double | 此规格的商品价格 | |
specStatus | String | y:显示规格;n:不显示规格 |
SPU :
SPU(Standard Product Unit):标准化产品单元。是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个SPU。
举例:Iphone6
SKU:
SKU=Stock Keeping Unit(库存量单位)。即库存进出计量的基本单元,可以是以件,盒,托盘等为单位。
举例:Iphonex+土豪金+32G
商品中心技术实现(详细页):
商品详细页:商品+图片+库存+店铺+商品相关的信息
特点:QPS高、相应速度高、变化少(商品名称和属性和信息一般不会修改)
总结:发现打开一个商品详细页对于后台要请求的数据还是挺多的,现在问题来了如果
京东这么大的流量,商品页面没有做相应的处理,肯定是要玩玩的。那优化方案是什么了?
业界有两种解决方案:
1、中小型电商平台:页面静态化
2、大型电商平台:动态渲染页面。
中小型电商平台:页面静态化:
常用模板技术:freemarker velocity
@RequestMapping(value = "/item/static/{id}",method = RequestMethod.DELETE)
@ApiOperation(value = "静态化商品")
public Result<String> buildStatic(@PathVariable Long id){String path = itemService.toStatic(id);if(StringUtils.isEmpty(path)){return new ResultUtil<String>().setErrorMsg("静态化商品页面出现异常");}return new ResultUtil<String>().setData(path);
}
此方式的缺点大家知道是什么吗?
1、不利于分布式(静态化页面过多不利于同步)
2、模板文件改动需要重新生成(JD上亿商品要要死吧)
大型电商平台:动态渲染页面。:
这种技术的话需要用到一些脚本语音:OpenResty、Lua、Nginx
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。
OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。
网址:http://openresty.org/
OpenResty安装:
下载:https://openresty.org/download/openresty-1.15.8.2-win64.zip
实战:
主要解决两个点:
** 一、流量分发**
** 二、缓存数据**
nginx+lua开发流量分发:
流量分发的nginx,会发送http请求到后端的应用层nginx上去,所以要先引入lua http lib包
wget https://raw.githubusercontent.com/pintsized/lua‐resty‐http/master/lib/resty/http_headers.lua
wget https://raw.githubusercontent.com/pintsized/lua‐resty‐http/master/lib/resty/http.lua
最近网络不稳定,也可以从:https://github.com/bungle/lua-resty-template 去下载这两个lua脚本
文件放在:openresty-1.15.8.2-win642\lualib\resty下
在nginx.conf文http模块中加入:
导入lua相关的包lua_package_path '../lualib/?.lua;;'; lua_package_cpath '../lualib/?.so;;'; 包含lua.conf文件include lua.conf; (实际演示文件名为:lua-demo.conf)
lua.conf文件内容(实际演示文件名为:lua-demo.conf):
新建lua.conf文件
server {listen 331;location /product {default_type 'text/html;charset=UTF-8';lua_code_cache on; content_by_lua_file D:/dis.lua; 流量分发逻辑写在dis.lua文件中}
}
dis.lua代码:
local uri_args = ngx.req.get_uri_args()
local productId = uri_args["productId"]
local host = {"127.0.0.1:332","127.0.0.1:333"}
local hash = ngx.crc32_long(productId)
hash = (hash % 2) + 1
backend = "http://"..host[hash]
local method = uri_args["method"]
local requestBody = "/"..method.."?productId="..productId
local http = require("resty.http")
local httpc = http.new()
local resp, err = httpc:request_uri(backend,{
method = "GET",path = requestBody, keepalive=false
})
if not resp then
ngx.say("request error :", err)
return
end
ngx.say(resp.body)
httpc:close()
端口号为:332的 lua-demo.conf
端口号为:333的 lua-demo.conf
访问:
http://localhost:331/product?method=product&productId=122
http://localhost:331/product?method=product&productId=123
nginx+lua开发页面缓存与渲染:
应用层还需要用到模板动态渲染技术,所以还需要引入lua的template包
wget https://raw.githubusercontent.com/bungle/lua‐resty‐template/master/lib/resty/template.lua
wget https://raw.githubusercontent.com/bungle/lua‐resty‐template/master/lib/resty/template/html.lua
最近网络不稳定,也可以从:https://github.com/bungle/lua-resty-template 去下载这两个lua脚本
两个lua文件放在:openresty-1.15.8.2-win642\lualib\resty\html下
增加html静态模板
<html><head><meta http‐equiv="Content‐Type" content="text/html; charset=utf‐8" /></head><body><h1>商品id: {* productId *}<br/>商品名称: {* productName *}<br/>商品原价: {* productPrice *}<br/>商品描述: {* productSpecification *}<br/>商品: {* productPictureList *}<br/></h1>
</body>
增加product.lua
local uri_args = ngx.req.get_uri_args()
local productId = uri_args["productId"]
local cache_ngx = ngx.shared.my_cache
local productCacheKey = "product_info_"..productId
local productCache = cache_ngx:get(productCacheKey)
if productCache == "" or productCache == nil thenlocal http = require("resty.http")local httpc = http.new()local resp, err = httpc:request_uri("http://127.0.0.1:7777",{method = "GET",path = "/goods/productDet?productId="..productId})productCache = resp.bodylocal expireTime = math.random(600,1200)cache_ngx:set(productCacheKey, productCache, expireTime)
end
local cjson = require("cjson")
local productCacheJSON =cjson.decode(productCache)
local context = {productId = productCacheJSON.productId,productName = productCacheJSON.productName,productPrice = productCacheJSON.salePrice,productPictureList = productCacheJSON.productImageSmall,productSpecification = productCacheJSON.detail
}
local template = require("resty.template")
template.render("product.html", context)
启动tomcat
@RequestMapping(value = "/goods/productDet",method = RequestMethod.GET)
@ApiOperation(value = "商品详情")
public ProductDet getProductDet2(Long productId){ProductDet productDet=contentService.getProductDet(productId);return productDet;
}
{
productId: 562379,
salePrice: 49,
productName: "坚果 Pro 软胶保护套",
subTitle: "TPU 环保材质、耐磨、耐油、耐久性强",
limitNum: 100,
productImageBig: "http://image.smartisanos.cn/resource/902befd5f32a8caf4ca79b55d39ee25a.jpg",
detail: "<img src="http://image.smartisanos.cn/resource/98521dbfe1dd1e67db3f7ca21e76c9ef.jpg" style="width:1220px;height:7000px;" alt="" />",
productImageSmall:
[
"http://image.smartisanos.cn/resource/902befd5f32a8caf4ca79b55d39ee25a.jpg"
]
}
启动nginx测试:
http://localhost:331/product?method=product&productId=562379
总结:
大致过程如上所述,其中细节问题还是挺多的,2b哥今天也弄了大半天,主要是这种nginx和lua的报错和语法不太熟悉,很容易出错的哦。不过终于还是把他弄好了。如果大家需要更详细的教程,可以关注2B哥的微信(微信搜:java2b)。喜欢文章的点个赞吧
商品还有其他的更细的业务哦,因为篇幅关系不能全部写完,如果有不足之处欢迎大家指出来哦。
在这边跟大家分享一些一线大厂Java面试题,希望能给后续想要去面试阿里巴巴等一线互联网大厂的小伙伴一些帮助!学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。
下面这个链接,暗号: csdn 。加入即可获得。
点这个,点这个。
另外还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
JD亿级流量电商平台商品模块业务与技术详解实战相关推荐
- 大型电商架构亿级流量电商详情页系统实战--redis基础票
亿级流量电商详情页系统实战-缓存架构+高可用服务架构+微服务架构 01_高并发高可用复杂系统中的缓存架构有哪些东西 (1)如何让redis集群支撑几十万QPS高并发+99.99%高可用+TB级海量数据 ...
- 亿级流量电商详情页系统实战:缓存架构+高可用服务架构+微服务架构
<缓存架构+高可用服务架构+微服务架构>深入讲解了亿级流量电商详情页系统的完整大型架构.同时最重要的是,在完全真实的大型电商详情页系统架构下,全流程实战了整套微服务架构,包含了基于领域驱动 ...
- 19.亿级流量电商详情页系统实战---总结
文章目录 1.亿级流量电商网站的商品详情页系统架构 2.redis企业级集群架构 3.多级缓存架构设计 4.数据库+缓存双写一致性解决方案 5.缓存维度化拆分解决方案 6.缓存命中率提升解决方案 7. ...
- 大型电商架构亿级流量电商详情页系统--实战 服务降级
86_电商网站的商品详情页缓存服务业务背景以及框架结构说明 我们这个课程,基于hystrix,如何来构建高可用的分布式系统的架构,项目实战 模拟真实业务的这么一个小型的项目,来全程贯穿,用这个项目中的 ...
- 大型电商架构亿级流量电商详情页系统实战-缓存架构+高可用服务架构+微服务架构(七)
文章目录 八十九.高并发场景下恐怖的缓存雪崩现象以及导致系统全盘崩溃的后果 九十.缓存雪崩的基于事前+事中+事后三个层次的完美解决方案 九十一.基于hystrix完成对redis访问的资源隔离以避免缓 ...
- 最新亿级流量电商详情页系统的大型高并发与高可用缓存架构实战第一版附全套资料
课程介绍(非升级版) 对于高并发的场景来说,比如电商类,o2o,门户,等等互联网类的项目,缓存技术是Java项目中最常见的一种应用技术.然而,行业里很多朋友对缓存技术的了解与掌握,仅仅停留在掌握red ...
- 亿级流量电商详情页系统的大型高并发与高可用缓存架构实战
2019独角兽企业重金招聘Python工程师标准>>> 对于高并发的场景来说,比如电商类,o2o,门户,等等互联网类的项目,缓存技术是Java项目中最常见的一种应用技术.然而,行业里 ...
- 亿级流量电商详情页系统的大型高并发与高可用缓存架构实战 目录
对于高并发的场景来说,比如电商类,o2o,门户,等等互联网类的项目,缓存技术是Java项目中最常见的一种应用技术.然而,行业里很多朋友对缓存技术的了解与掌握,仅仅停留在掌握redis/memcache ...
- 亿级流量电商详情页系统的大型高并发与高可用缓存架构
1.亿级流量电商网站的商品详情页系统架构 面临难题:对于每天上亿流量,拥有上亿页面的大型电商网站来说,能够支撑高并发访问,同时能够秒级让最新模板生效的商品详情页系统的架构是如何设计的? 解决方案:异步 ...
最新文章
- java中 resource_Java从Resource中读取文本文件
- GMM 模型需不需归一化问题
- 数据挖掘 概念与技术(原书第3版)
- 计算机外观类型,知道你的笔记本电脑是什么类型的吗?五大类型派对号入座
- linux分区合并不损坏系统,更改磁盘分区后修复GRUB启动
- 数组的定义格式三_省略的静态初始化
- 向MPEG创始人Leonardo Chiariglione提问
- WWW超文本源码浏览器
- 苹果系统c语言打开文件夹,MAC系统硬盘文件夹详解
- 青岛达内php培训多少钱_北京北京青岛椅群 多少钱
- DeFi信用合作社Xend Finance将于今日23时通过Balancer LBP开启公募
- android小程序:计算圆面积
- 网页的根标记是 html,网页的根标记是,主体标记是_________。
- 广告行业中那些趣事系列36:腾讯2021广告大赛多模态视频广告标签baseline介绍和优化思路...
- android 2d 漫画界面,宅男舔屏必备!动漫人物Live2d壁纸App
- win7管理员取得所有权
- 2022-04-14每日刷题打卡
- 我用Python模拟了谷爱凌的凌空一跃
- 消防应急照明系统在某数据中心项目的应用
- python算法问题_算法重心问题树(Python),的
热门文章
- 字符串最大跨距(c++)
- 软件工程 | 第一章 软件工程概论
- 文泉驿正黑体可下载使用了!
- 在excel表格中,如何将一个工作簿中十张工作表的数据统一归整到同一张表上?
- 使用 ffmpeg 命令实现图片和视频相互转换
- opencv 显示中文汉字(添加中文支持)
- 数据传输:json格式序列化与反序列化(将类转化为json格式与将json格式转化为类)
- WINDBG u win32k!NtUserSendInput 出现 Memory access error处理方法()
- 第三章 汇编语言基础
- 学科竞赛生的十条“军规”