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

目的:

目前有上万个用户,产生了上万条消费记录,想实时更新用户消费排名,看看哪一个用户消费排名最高。

自己想到最笨办法就是循环查询所有人的消费总额,然后倒叙显示。但是这样的话存在一个问题就是非常非常的消耗资源,每次用户打开页面,系统都要重复循环统计上万会员的消费金额,然后再倒叙显示,造成服务器压力过大。

有没有一个什么其他的办法可以实现相同功能的,或者新建数据表什么的,麻烦高手指点

目前的表结构是这样的:

  • ID 商品ID
  • UID 用户ID
  • Name 商品名称
  • Price 商品价格
  • Type 商品类型
  • Size 商品尺寸
  • Beizhu 备注信息
  • Shenhe 审核内容
  • State 商品状态
FFIVE
浏览 590回答 11
11回答

慕森王

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

米琪卡哇伊

用redis SortedSet(有序集合)做

慕尼黑的夜晚无繁华

redis sorted set

PIPIONE

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

ITMISS

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

交互式爱情

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

莫回无

select user_id,sum(cash) total_fee from orders group by user_id order by total_fee DESC LIMIT 1; 效率应该不会很低把?想查前几名就limit几

12345678_0001

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

临摹微笑

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

海绵宝宝撒

先按照uid group by,然后再按照sum的值倒排 SELECT uid,SUM(price) AS total_price FROM table GROUP BY uid ORDER BY total_price DESC
打开App,查看更多内容
随时随地看视频慕课网APP