0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

京东APP百亿级商品与车关系数据检索实践

京东云 来源:jf_75140285 作者:jf_75140285 2024-10-18 14:14 次阅读

作者:京东零售 张强

导读

本文主要讲解了京东百亿级商品车型适配数据存储结构设计以及怎样实现适配接口的高性能查询。通过京东百亿级数据缓存架构设计实践案例,简单剖析了jimdb的位图(bitmap)函数和lua脚本应用在高性能场景。希望通过本文,读者可以对缓存的内部结构知识有一定了解,并且能够以最小的内存使用代价将位图(bitmap)灵活应用到各个高性能实际场景。

1.背景

整个汽车行业行特殊性,对于零配件有一个很强的对口特性,不同车使用的零配件(例如:轮胎、机油、三滤、雨刮、火花塞等)规格型号不一样。在售卖汽车零配件的时候,不能像3C家电、服饰,需要结合用户具体车辆信息推荐适合的配件商品。基于此原因,京东自建人车档案模型并且利用算法清洗出百亿级的车型-零配件的适配关系数据,最终形成“人->车-〉货”关系链路,解决“人不识货”的问题。 具体使用场景如下图:

wKgaoWcR_MiAF4EfAAT978sd1S078.jpeg

.

wKgZoWcR_MqAK3MzAANtNwzzHT403.jpeg

图1.1京东商详推荐商品 图1.2京东加购弹窗推荐商品

2.数据模型

人-> 车->货”关系的核心链路是由人(京东用户)、乘用车和SKU这三部分组成。

首先,用户在京东APP的商搜页、商详页多个位置都可以选择自己的车型信息进行绑定(例如:图2.1,京东商详绑车入口位置“+添加爱车”按钮),建立“人车档案”数据。

wKgaoWcR_MqAXWr3AATw2l9QXhA34.jpeg

.

wKgZoWcR_MuAZJtdAANgcMfAbJE47.jpeg

图2.1.京东商详绑车入口位置 图2.2.京东商搜绑车入口位置

其次,运营在后台管理系统中将商品与车型进行绑定,建立“商品与车型关系”数据(商品与车型的关系数据量级在百亿级别)。

最终,购买商品的时候,京东推荐系统可以通过用户自己绑定的车型推荐出适合该车型的商品。具体商品适配车型数据模型,见图2.3

wKgaoWcR_M2AOcHWAAI0yU6Log0665.png



图2.3京东商品适配车型数据模型

3.缓存结构设计

基于前面两个部分的介绍,我们可以了解到整个商品搜索适配推荐存在两个最核心问题。第一、百亿级商品适配车型数据的存储结构设计,尽可能的占用资源成本最小;第二、商详通过用户车型来搜索适配商品时,必须保证接口性能的TP99位于毫秒级。最终技术选型的时候,采用了jimdb的位图(bitmap)函数来进行数据存储。

3.1位图(bitmap)结构

位图(bitmap)是通过最小的单位bit来进行0或者1的设置,表示某个元素对应的值或者状态。一个bit的值是0或者1;也就是说一个bit能存储的最多信息是2。

•位(bit):计算机内部数据存储的最小单位,例如:11001100是一个八位二进制数。

•字节(byte):计算机中数据处理的基本单位,习惯上用大写B来表示,1B(byte,字节)=8bit。

wKgZoWcR_M6AX3m3AACTCzYahjQ513.png



图3.1位图(bitmap)内部结构

3.2位图(bitmap)数据写流程

位图(bitmap)是基于jimdb的SDS(简单动态字符串)类型的一系列位操作,遵循jimdb的SDS特性,例如:位图(bitmap)最大长度512M,最大可以存储232位。以下是“big”字符串的SDS结构示例:

wKgaomcR_M-AbBuvAADfWEfEWXU899.png



图3.2.1“big”字符串的SDS结构

SDS(简单动态字符串)为了保证性能采用了空间预分配的策略:空间预分配用于优化SDS的字符串增长操作。SDS的API对一个SDS进行修改并且需要对SDS进行空间扩展的时候,程序不仅会为SDS分配修改所必须要的空间,还会为SDS分配额外的未使用空。具体预分配流程图如下:

wKgaomcR_NGAWnpjAAJxULAmRvs332.png



图3.2.2SDS预分配流程图

位置1:创建SDS简单字符串预分配空间为:偏移量/8+1。

位置2:剩余空间不足时,预分配空间流程。

3.3压缩商品与车关系缓存

偏移量(自增ID) 全量车型 商品SKU
1 1165788 101362
2 1165793 101362

商品适配车型关系(百亿级数据量)

商品与车关系缓存存储过程中,采用了商品SKU作为KEY,全量车型ID的偏移量(采用偏移量是为降低内存消耗)作为VALUE值来进行存储。

全量车型ID大约有几十万的数据量,极限情况下一个商品SKU可以适配几十万辆车,很容易造成缓存大KEY的问题,为此我们进行了偏移量(全量车型ID对应的自增ID)的分段处理。具体是按照:SKU作为缓存KEY的基础上,追加一个分段标记数字作为新KEY,每个偏移量都会按照分段范围对应一个分段标记数字。例如:偏移量1~50000,对应缓存KEY为SKU+0;偏移量50001~100000,对应缓存KEY为SKU+1,其它偏移量以此类推,这样就保证了一个SKU即使适配所有车辆也不会出现缓存大KEY的情况。

BitMap缓存结构底层使用SDS简单字符串,为了保证性能采用了预分配空间的策略(图3.2.2,“缓存BitMap内部存储流程图”的“位置2”中虚线框圈选),这样在缓存商品与车关系的时候浪费了大量的缓存空间。为此我们调整了偏移量存储顺序,首先获取到需要缓存的车型内最大的偏移量,保证同一个缓存KEY第1次创建SDS简单字符串(图3.2.2,“缓存BitMap内部存储流程图”的“位置1”中虚线框圈选)后,不再进行第2次空间扩容,这样来最大限度的提升缓存利用率,起到压缩空间目的。缓存数据关系流程如下:

wKgaomcR_NOAIJVhAAHPI7utY9s519.png



图3.3.1缓存数据关系流程

位置3:设置分段最大的偏移量,保证后续新增偏移量不再扩容空间。

位置4:设置分段较小的偏移量。

全量车型ID是定长7位的数字,如果用它作为偏移量将消耗内存巨大,所以采用对应自增ID作为偏移量。最终在bitmap缓存的商品SKU与车的适配关系缓存结构如下图:

wKgaomcR_NSAbMtwAACrt0kyjjM782.png



3.3.2商品与车缓存结构图

位置5:spuId用{}括起来表示缓存路由(Lua脚本中同一次请求,数据必须在缓存同一个分片上,否则会丢失数据)。POP商品spuId是SKU的产品ID,自营商品spuId是SKU的MainSkuId。

备注:

1、自营商品MainSkuId可能发生变化,所以我们接入了商品变化MQ消息,实时调整SKU与车适配关系的存储位置。

2、京东商详页面中每个不同的规格/型号分别对应不同的SKU,但是它们都对应同一个SpuId或者MainSkuId。

4.缓存架构设计

商品与车的关系数据量每天都在不断增长,要求缓存架构设计,需要支持集群横向/纵向扩容和来满足业务发展以及高可用性。整个缓存架构体系主要有前端、京东养车商品与车关系层和存储三部分组成。

“商品与车关系缓存架构”层核心包括:1、“集群路由”层,实现了集群横向扩容,保证数据量增涨的时候,缓存容量也能跟上。2、“分片路由”层,保证搜索的底层数据的分片相同,避免数据丢失。

“存储”层核心包括:1、实现了缓存压缩,参见3.3压缩商品与车关系缓存。2、单元化实现跨区域灾备,保障大促系统稳定性。具体商品与车关系缓存架构如下:

wKgZomcR_NaAJW1kAALZ0atVmLE441.png



4.1商品与车关系缓存架构图

位置6:集群路由,通过商品类型或者商品编号(POP商品)路由到不同缓存集群,便于横向扩展,每个集群单分片限制,解决分片超过限制问题。

位置7:分片路由,保障Lua脚本搜索数据的底层数据集群分片相同,避免数据丢失。其中自营商品和POP商品的路由分别是main_sku_id和product_id。

位置8:自营商品缓存集群,单元化实现跨区域灾备,采用自研DRC(Data Replication Center)数据同步机制。

位置9:POP商品缓存集群,通过商家编号拆分为两个子集群。

5.高性能搜索

基于BitMap(位图)缓存的商品与车关系数据,商详调用接口的内部实现采用了Lua脚本来降低网络开销,保障整个接口的性能。以下是搜索接口的流程图:

wKgaomcR_NeAZc5JAAG3ktclSW8202.png



5.1商详搜索商品与车适配关系流程图

位置10:商详调用接口的时候,要传两个参数。第1个参数是全量车型ID列表,大约5个全量车型ID。第2个参数是商品SKU列表,SKU的数量极限超过200个。最后全量车型ID与商品SKU组合为上千个商品与车的关系后,再到百亿级适配关系去搜索看是否匹配的。如果不匹配返回适配商品,反之则返回不适配。

Lua脚本减少了应用服务器与缓存服务器的交互,降低了网络开销的时间,达到提升搜索服务的性能。以下是Lua脚本具体代码:

wKgZomcR_NiAdDNkAAPY3rVQ7wA158.png



5.2商详搜索商品与车适配关系Lua代码

基于以上缓存设计和Lua脚本的使用,整个接口T999小于13ms。具体的接口性能监控如下图:

wKgaomcR_NqAE1K3AAqOPElpQBA925.png



5.3商详搜索商品与车适配关系接口性能

6.总结

整个缓存结构设计的时候,使用BitMap(位图)来存储数据。解析SDS的内部存储流程,通过存储流程机制避开预分配空间节点,最大限度的利用缓存空间,避免资源浪费。采用Lua脚本来实现数据的适配搜索,降低网络开销,进一步提升接口的性能。希望此文对大家后续设计类似场景有一定的帮助和启发。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7134

    浏览量

    89456
  • 内存
    +关注

    关注

    8

    文章

    3052

    浏览量

    74247
  • 缓存
    +关注

    关注

    1

    文章

    241

    浏览量

    26732
  • 京东
    +关注

    关注

    2

    文章

    1000

    浏览量

    48673
收藏 人收藏

    评论

    相关推荐

    【NUCLEO-F412ZG申请】物联网数据检索

    申请理由:项目描述:用开发板开发一款物联网数据检索产品,输入为一个UART口,输出为一个UART口。来自物联网数据采集设备的串口数据从输入口进来,经过STM32F412接收、处理后,筛选出符合条件
    发表于 11-07 16:33

    求助:labview如何实现历史数据检索

    毕设救急:labview历史数据检索如何实现?
    发表于 05-14 10:35

    求大佬帮忙完善一下这个图书信息检索的小程序

    这个程序网上弄得,关于数据检索这一块不知道怎么弄,我是初学者,请各位多多指点,txt图书信息怎么写逗可以,只要程序可以运行检索就好
    发表于 05-11 15:13

    模拟京东非淘宝,购买商品SKU SPU点击过滤属性

    模拟京东非淘宝,购买商品 SKU SPU点击过滤属性参数
    发表于 05-25 09:32

    分析一下MySQL数据库与ElasticSearch的实际应用

    ,可以使用ElasticSearch全文检索引擎来解决这个问题,使得TB级数据在毫秒就能返回检索结果,该引擎使用倒排索引,流程优化如下图:原作者:蟹黄瓜子 GreatSQL社区
    发表于 06-15 17:15

    基于关系数据库的本体生成器设计与实现

    为了利用已有的关系数据库自动生成本体,分析关系数据库与OWL 本体的形式化对应关系,设计一套转换规则,给出一种由关系数据库出发自动建立本体的新方法。在VC++环境下实现一
    发表于 03-20 14:23 18次下载

    关系数据库是什么?

    关系数据库是什么? 数字时代伊始,数据库就一直是商业计算的核心组成部分。事实上,关系数据库诞生于1970年。那一年,IBM的研究员E.F. Codd撰写了一篇论文,概述了主
    发表于 07-31 12:26 2229次阅读

    打造百亿无人智能制造基地,京东无人总部选择落户长沙

    无人科技产业布局潇湘大地,京东百亿无人智能产业基地持续落地!6月11日,京东集团与长沙经济开发区就京东无人
    发表于 06-20 15:24 2749次阅读

    关系数据库系统的特点

    关系数据库系统建立了关系模型,并用它来处理数据关系模型在表中将信息与字段关联起来(也就是schemas),从而存储数据
    的头像 发表于 02-22 15:09 8271次阅读

    为什么要使用非关系数据

    着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。而传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类
    发表于 09-25 17:38 10次下载
    为什么要使用非<b class='flag-5'>关系数据</b>库

    如何实现一种针对关系数据库储存过程的空间可视化检索算法

    该文针对利用GIS现有空间查询接ISI进行海量遥感栅格数据库空间可视化检索效率低下的问题。在深入研究海量遥感栅格数据库的空间可视化检索特点的基础上,提出了一种直接针对
    发表于 09-29 17:07 5次下载

    如何使用工业实时数据库与西门子PLC通讯?

    工业实时数据库是一个基于时间信息的存储仓库,存储大量的过程数据,并且提供灵活的数据检索过程。 我们平时经常使用MySQL/SQL Server/Oracle等这些传统的关系数据库,为什
    的头像 发表于 03-29 15:46 9261次阅读
    如何使用工业实时<b class='flag-5'>数据</b>库与西门子PLC通讯?

    面向数字取证专家的一线图像数据检索

    本文概述了取证专家和急救人员为何以及如何从提供图像数据检索的工具中受益。所审查的产品是用于数据检索和映像装载的一线工具,因为如果不先装载映像,就无法检索数据。此外,能够在任何操作系统下
    的头像 发表于 10-20 17:07 2113次阅读
    面向数字取证专家的一线图像<b class='flag-5'>数据检索</b>

    使用涂鸦link SDK的土壤水分数据检索应用

    电子发烧友网站提供《使用涂鸦link SDK的土壤水分数据检索应用.zip》资料免费下载
    发表于 06-14 10:42 0次下载
    使用涂鸦link SDK的土壤水分<b class='flag-5'>数据检索</b>应用

    软件系统的数据检索设计

    软件系统的数据检索设计 随着业务量加大,数据检索量也会日益增多,为了减轻数据库压力,本系统采用ElasticSearch来实现数据检索功能。 简单来说,Elasticsearch 是一
    的头像 发表于 08-22 14:08 307次阅读
    软件系统的<b class='flag-5'>数据检索</b>设计