arabera 旭 王 14 years ago
531
Honelako gehiago
讯价的作用
得到商品实时的价格。
讯价的规则
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大小不等
按频道
图书还是很大
简单
在讯价中取商品价格优先级高于取同类商品价格。
1.数据库
2.索引
3.两个缓存
索引
数据库
缓存
1.接收InfoCode
2.取缓存数据,判断是否讯价(通过UpdateTime)
3.调用讯价方法(foreach供货商)
4.更新数据(如果价格改变)
IList
HS
Value:IList
Key:InfoCode
1.接收InfoCode,判断是否讯价(通过UpdateTime)
2.生成最低价供货商URL和参数
3.抓取解析购物车HTML,取实时价格。
4.更新数据(如果价格改变)
4.返回ProviderPrice。
ProviderPrice
updateTime
price
providerName
providerId