求一个商品热度排序的解决方案

2022-11-25 10:24:47 +08:00
 Hanggi

目前有商品表和订单表。
订单记录了购买的商品 id 和价格。

为了优化商品流的呈现,要为商品做热度排序:
根据商品的浏览量、收藏量、销售额进行评分排序。

同时为了防止热门的商品一直排在前面,对以上信息添加基于时间的权重。
(比如 7 天内销量权重高,15 天权重减半,30 天权重再减半,超过 30 天就不记录在内)

目前数据在 SQL 数据库中,同时有 Redis 作为缓存使用。

在商品数量不断上升的前提下,有没有比较成熟高效的热度排序方案呢 (暂时不考虑 AI 排序)

1833 次点击
所在节点    程序员
10 条回复
leogm9408leo
2022-11-25 10:42:35 +08:00
这个排序其实是很常见的业务场景,数据同步到 es ,浏览量、收藏量这些作为排序因子,时间作权重因子,在 es 里用排序脚本排序
lawsiki
2022-11-25 10:43:52 +08:00
redis zset 排序?每次读取缓存的时候根据权重更新 score
jaggle
2022-11-25 10:50:32 +08:00
@leogm9408leo 排序脚本性能如何,会不会很慢呢,因为我想到这样就没法用索引了
leogm9408leo
2022-11-25 11:04:08 +08:00
@jaggle #3 es 做这种简单脚本排序性能还是很 OK 的,算是业界最常用的开源组件了。当然也看你们的数据规模,如果总共也就几千条数据要排序,那全量 load 到内存里直接计算成本更低,如果有百万的在售商品,那用 es 更省心
liuhuansir
2022-11-25 11:12:15 +08:00
看你举例的权重方案,估计对实时性要求也不高,直接搞成定时任务,跑完入库就行了吧
Hanggi
2022-11-25 11:48:09 +08:00
@leogm9408leo 不用 ES 呢?
leogm9408leo
2022-11-25 11:54:41 +08:00
@Hanggi #6 看业务的数据量和实时性要求,如果数据量少,可以全部 load 到内存做计算,如果实时性要求不高,可以用定时任务异步算分
wudaye
2022-11-25 12:00:57 +08:00
加个热度字段或者热度索引表,然后定时任务更新热度就行了
Hanggi
2022-11-25 12:13:21 +08:00
@liuhuansir
@wudaye
其实这个是目前考虑的一个方案,跑个 cron 定时任务存到 redis 里。

顺便想了解下有没有其他更简单高效的方法
ghostwind
2022-11-25 16:44:43 +08:00
热度排序是 topN 的还是 全排序的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/897782

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX