Categories: All - 数据

by 旭 王 14 years ago

531

讯价详细设计

讯价系统旨在提供商品的实时价格,通过自动化规则和多线程技术,以确保热门商品每两小时更新价格,非热门商品每日更新一次。系统主要通过购物车或供货商接口获取价格,并使用缓存技术优化性能和空间占用。系统结构设计包括商品信息编码列表和商品价格数据,采用哈希表存储。接口定义了获取最低价和多个商品价格的方法,支持更新商品价格和编辑热门商品状态。对现有数据结构进行修改,增加热门商品标识字段。

讯价详细设计

讯价详细设计

讯价的作用

得到商品实时的价格。

讯价的规则

1. 不讯价的情况

 3小时内更新的热门商品

 1天内更新的非热门商品

2. 自动讯价频率

 热门商品2小时一次

 热门商品2小时一次

讯价的方式

1. 考虑从购物车获得价格。购物车数据量最小,有可能需要通过Cookie传参数。

2. 与供货商建立合作关系,由供货商提供价格接口。

应用技术

缓存

 性能考虑

Length为300万的HashTable会否有性能问题?

如果对性能影响较大,可以考虑的几种拆分方式:

 按频道(操作简单,但图书频道还是很大)

 按InfoCode区间(大小不统一,拆分碎片可能过多)

 热门/非热门

 占用空间

数据按300万计算:

 商品InfoCodeList,占用17M左右。(InfoCode(6)*300万=17M)

 商品价格,占用635M左右。

(provider(40)+providerName(16)+price(6)+updateTime(10))*3>

216*300万=635M

 分类

 商品价格数据

作用:存储商品在各供货商实时售价。

结构:HashTable(Key:InfoCode;Value:IList<ProviderPrice>)

 商品InfoCode String[]

作用:维护全部商品InfoCode列表,自动讯价使用

结构:字符串数组。

服务(自动讯价)

 热门商品2小时一次

 热门商品2小时一次

多线程

 线程池:讯价需要支持多并发。

现有数据结构修改

1. 增加热门商品记录字段。

 GoodsInfo表加标识字段

 索引加标识字段

2. 商品分类

 热门商品

 非热闹商品

接口定义

讯价取商品最低价

 参数:InfoCode

 返回:ProviderPrice

 逻辑:

1. 接收InfoCode,判断是否讯价(通过UpdateTime)

2. 生成最低价供货商URL和参数

3. 抓取解析购物车HTML,取实时价格。

4. 更新数据(如果价格改变)

5. 返回ProviderPrice。

取多个商品价格(推荐商品)

 参数:"InfoCode,InfoCode,InfoCode"

 返回:HashTable(Key:InfoCode;Value:IList<ProviderPrice>)

指定商品在各供货商售价格比较

 参数:InfoCode

 返回:IList<ProviderPrice>

 逻辑:

1. 接收InfoCode

2. 取缓存数据,判断是否讯价(通过UpdateTime)

3. 调用讯价方法(foreach供货商)

4. 更新数据(如果价格改变)

商品价格更新

 参数:InfoCode, IList<ProviderPrice>

 返回:更新结果(成功/失败)

 逻辑:

1. 判断此次操作是 Insert还Update。新商品为Insert。

2. 更新内容包括:缓存、数据库、索引。

编辑热门商品状态

 参数:InfoCode(可接收多个),状态(1表示热门商品 2表示非热门商品)

 返回:更新结果(成功/失败)

 逻辑:

1. 更新数据库中商品状态

2. 更新索引中商品状态

3. 更新两个缓存

实体类

ProviderPrice

属性 说明 类型

providerId 供货商Id Guid

providerName 供货商名称 String

price 价格 Double

updateTime 更新时间 DateTime

应用技术

多线程、并行计算
线程池
服务
自动讯价
分类

商品InfoCode String[]

作用:维护全部商品InfoCode列表,自动讯价使用

商品价格数据

作用:存储商品在各供货商实时售价。

缓存结构

占用空间

预算

数据按300万计算

商品InfoCodeList,占用17M左右。

InfoCode(6)*300万=17M

商品价格,占用635M左右。

(provider(40)+providerName(16)+price(6)+updateTime(10))*3>

216*300万=635M

性能考虑

300万长度的HS是否有性能问题?

几种拆分方式

热门/非热门

按InfoCode安区间

HS可以会较多

各HS大小不等

按频道

图书还是很大

简单

现有数据结构修改

商品分类
非热闹商品
热门商品
增加热门商品记录字段
索引加标识字段
GoodsInfo表加标识字段

延迟加载

讯价按功能按供货商及频道进行分类,便于维护。

异常处理

讯价无结果使用原价格

讯价的规则

自动讯价频率
非热门商品1天一次
热门商品2小时一次
不讯价的情况
1天内更新的非热门商品
3小时内更新的热门商品

接口

单个性能要优于多个

在讯价中取商品价格优先级高于取同类商品价格。

编辑热门商品

1.数据库

2.索引

3.两个缓存

接收InfoCode(可接收多个)
商品价格更新
Insert/Update
返回更新结果(成功/失败)
接收InfoCode, IList
更新内容

索引

数据库

缓存

指定商品在各供货商售价格比较

1.接收InfoCode

2.取缓存数据,判断是否讯价(通过UpdateTime)

3.调用讯价方法(foreach供货商)

4.更新数据(如果价格改变)

IList

接收InfoCode
取多个商品价格(推荐商品)

HS

Value:IList

Key:InfoCode

参数:"InfoCode,InfoCode,InfoCode"
讯价取商品最低价

1.接收InfoCode,判断是否讯价(通过UpdateTime)

2.生成最低价供货商URL和参数

3.抓取解析购物车HTML,取实时价格。

4.更新数据(如果价格改变)

4.返回ProviderPrice。

返回

ProviderPrice

updateTime

price

providerName

providerId

参数:InfoCode