为了账号安全,请及时绑定邮箱和手机立即绑定

用户消费金额排名设计思路

用户消费金额排名设计思路

PHP
FFIVE 2019-03-18 18:09:50
目的: 目前有上万个用户,产生了上万条消费记录,想实时更新用户消费排名,看看哪一个用户消费排名最高。 自己想到最笨办法就是循环查询所有人的消费总额,然后倒叙显示。但是这样的话存在一个问题就是非常非常的消耗资源,每次用户打开页面,系统都要重复循环统计上万会员的消费金额,然后再倒叙显示,造成服务器压力过大。 有没有一个什么其他的办法可以实现相同功能的,或者新建数据表什么的,麻烦高手指点 目前的表结构是这样的: ID 商品ID UID 用户ID Name 商品名称 Price 商品价格 Type 商品类型 Size 商品尺寸 Beizhu 备注信息 Shenhe 审核内容 State 商品状态
查看完整描述

11 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

在用户主表里面添加统计字段,用户每消费一笔,在数值上加上去

查看完整回答
反对 回复 2019-03-18
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

用redis SortedSet(有序集合)做

查看完整回答
反对 回复 2019-03-18
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

redis sorted set

查看完整回答
反对 回复 2019-03-18
?
PIPIONE

TA贡献1829条经验 获得超9个赞

还是定时任务算报表比较靠谱,这种需求,不该做成实时的,各种逻辑 (支付,退款,使用优惠券,使用积分)各种埋点,如果是这样太复杂,定时任务 报表统计比较稳当,当然如果业务简单,可以考虑vilay的思路,不过家在用户表里面感觉不合适,新建表吧

查看完整回答
反对 回复 2019-03-18
?
ITMISS

TA贡献1871条经验 获得超8个赞

这种比较推荐的就是以uid为维度建表,以后各种关于uid的统计数据都放到里面,产生消费就更新这个字段的数据,这种也不会产生效率问题,只是多更新一个字段而已。觉得用redis有序集合,挺方便,但是如果涉及到要把这些数据做列表并支持搜索之类的,那就还是要同步到mysql,就比较麻烦了。

查看完整回答
反对 回复 2019-03-18
?
交互式爱情

TA贡献1712条经验 获得超3个赞

提供个思路:
1、每天固定一个时间点(比如半夜12点)查询用户消费记录,结果存入缓存(redis/memcached/文件缓存或其它)
2、用户每次消费时向用户消费记录缓存里加上消费金额
3、页面取出缓存数据展示

查看完整回答
反对 回复 2019-03-18
?
莫回无

TA贡献1865条经验 获得超7个赞

select user_id,sum(cash) total_fee from orders 
group by user_id 
order by total_fee DESC 
LIMIT 1;

效率应该不会很低把?想查前几名就limit几

查看完整回答
反对 回复 2019-03-18
?
12345678_0001

TA贡献1802条经验 获得超5个赞

赞同楼上的redis方案,最简单有效的方法就是缓存,你的消费排行榜可以在夜间更新,当然了也可以设定时间单位,其它方法可能就更麻烦了

查看完整回答
反对 回复 2019-03-18
?
临摹微笑

TA贡献1982条经验 获得超2个赞

“实时“ “最高” ,通过这两点,我get到的信息是并不需要所有的排名,只需要取出排名靠前的展示出来,将这部分数据缓存。考虑到另一个关键点“实时”,楼主可以根据客户的平均消费额和消费频次,以及排名靠前的客户总额差额设计一个算法,比如我们仅取前10名的数据,最十名总消费额1万,当其他用户进行消费时,就与1万这个临界值进行比较。如果超过一万,则更新缓存。同时也监控前10人的消费情况,如果金额变动影响了排名则同时更新缓存

查看完整回答
反对 回复 2019-03-18
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

先按照uid group by,然后再按照sum的值倒排

SELECT uid,SUM(price) AS total_price FROM table GROUP BY uid ORDER BY total_price DESC
查看完整回答
反对 回复 2019-03-18
  • 11 回答
  • 0 关注
  • 589 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信