100万用户量“排行榜列表”和“我的排名”功能优化记录

  • 前言背景:
  • 难点:
  • 解决过程:
  • mongodb小坑:
  • 总结优化过程:
  • 最后:
  • 参考:

前言背景:

最近做一个预算100万用户量的项目,需要优化,尤其是“排行榜列表”和“我的排名”功能。比较判定的逻辑是:

“排行榜列表”:
分数倒序,用时升序,用户ID升序

“我的排名”:(
(分数 < 我的分数)
|| (分数 = 我的分数 && 时间 < 我的时间)
|| (分数 = 我的分数 && 时间 = 我的时间 && 用户ID < 我的ID)
)

难点:

"or"查询无法触发索引

解决过程:

一开始尝试的数据库索引优化,结果效果不理想。
然后尝试把数据取出到php处理,结果内存爆满(其实该方法只适合数据计算较复杂的逻辑,数据量大的情况不合适);
然后采用redis加锁查数据库存缓存定时过期刷新的方法,结果客户说要即时的(而且这个方法也优化不了“我的排名”,只能优化“排行榜列表”);
然后采用mongodb,芒果有提供类似mysql一样的排序查询语句,可以直接在数据库里面处理,而芒果数据是在缓存里面的,所以可以直接在缓存里面执行语句,速度嘎嘎快,解决了“排行榜列表”的即时需求和性能问题,但是“我的排名”消耗依然高,因为不管是mysql还是mongodb,“or”都是不能触发索引的,哪怕芒果数据是在缓存里,100万数据不用索引也够呛。
然后采用分表的方法,由于游戏比较简单,所以估计80-100分的人居多,所以按这样分表(0-80,80-85,85-90,90-95,95-100),在设个冗余表,记录每个分表的总数。插入数据时,根据分数范围插入对应表和在对应分表总数加一,查询“我的排名”时,根据我的分数查找对应分表,计算我在该分表的排名,加上前面分表的总数,算出我的总排名。大功告成!

mongodb小坑:

用php这种弱类型语言插入数字很可能被识别为字符串,从而排序出现问题

总结优化过程:

索引 -> php代替mysql计算 -> redis -> mongodb -> 分表+冗余表

最后:

分表的优化操作有点麻烦,就去磨了一下产品,砍掉了“我的排名”需求哈哈哈,所以这个分表操作最终没有落地,但理论上应该是可行的。所以最终是用mongodb实现了“排行榜列表”的优化,用砍产品的方式实现了“我的排名”优化哈哈。
一直以为redis已经能处理大部分的单机优化了,直到遇到了100万用户量的排行榜和我的排名这样的需求,数据库排序消耗太大,加索引也不行,取到php处理,php内存消耗也大,redis不能做多条件的排序(比如分数倒序,时间升序,id升序按这三个条件来排,redis就做不到),最后就用上了mongodb,这个以为已经被淘汰的工具。

参考:

https://www.php.net/manual/zh/book.mongodb.php php的mongodb原生驱动
https://www.mongodb.com/docs/v4.2/crud/ mongodb官方文档
https://www.yisu.com/zixun/39612.html php封装mongodb
https://www.php.cn/php-weizijiaocheng-405982.html php的mongodb操作
https://www.kancloud.cn/noahs/linux/1425616 用户权限操作

【100万用户量“排行榜列表”和“我的排名”功能优化记录】相关推荐

  1. 巴比特 | 元宇宙每日必读:上线三天,用户量突破100万,茅台推出“元宇宙”APP“巽风”,其核心玩法是什么?...

    摘要:1月1日,茅台正式上线元宇宙平台APP"巽(xùn)风",开启了茅台元宇宙数字世界,据了解"巽风"上线仅三天,正式用户数量轻松突破100万.茅台元宇宙世界 ...

  2. linux中的vsprintf_Git29 年超 100 万次 commit,Linux 内核何以发展至今?

    1991 年,21 岁的芬兰大学生 Linus Torvalds 写下第一行 Linux 内核代码时,多半没有想到它会成长为今天这样的庞然大物. 当年 8 月 25 日,Torvalds 在 Mini ...

  3. 《微SaaS创富周刊》第9期:如何把创业者访谈,变成年收入100万+美元的生意

    导读 大家好!第9期<微SaaS创富周刊>面世啦(点击这里阅读第1期),感谢大家的关注和阅读!本周刊面向独立开发者.早期创业团队,报道他们主要的产品形态--微SaaS如何变现的最新资讯和经 ...

  4. 开发微信小程序,100 万开发者都离不开它

    一种比较笼统的说法是,过去二十年,互联网彻底改变了人们的生活方式.但对这种影响人类吃穿住行的变革,再具体一点的说法是,"软件吞噬世界",互联网的背后是社交.电商.游戏.短视频等一个 ...

  5. 在1 MB RAM中排序100万个8位数字

    本文翻译自:Sorting 1 million 8-digit numbers in 1 MB of RAM I have a computer with 1 MB of RAM and no oth ...

  6. 【干货】如果你的推广周期是一年,怎样激活100万目标用户

    现在很多做App推广的新人或者刚接手一个App的推广项目,都会要求让写一个推广计划和目标,这个目标的设定要和你的推广周期相符合,比如你的推广周期是一年,你就要写一年内的推广目标,具体看设定的推广周期是 ...

  7. 100万“愤怒的小鸟”:中国手机开发者生存调查

    2019独角兽企业重金招聘Python工程师标准>>> 在很多投身这一行业的开发者心中,都怀揣着一夜成名的梦想,希望有一天能做出像<水果忍者>.<愤怒的小鸟> ...

  8. 自己帮别人写的网站可以公开源码吗_雷军靠写代码赚第一个 100 万,马化腾亲自写腾讯网,码农出身的大佬...

    作者 | 夏弢 本文经授权转载自创业邦(ID:ichuangyebang) 一提到程序员,很多人脑海里马上会出现这些刻板标签: 可事实上,有一个词似乎更能概括: 改变世界 程序改变世界,已经有几十年了 ...

  9. 100 万在中国不同地方能活多久?

    最近,一张名为 "100 万在中国各省能生活多久?" 的图片在网上流传 话不多说,往下看 没错,就是正如你们看到的 天朝大北京 以"100万能活19年9个月"的 ...

最新文章

  1. 网站优化不仅仅只为排名而在!
  2. 【Android 逆向】代码调试器开发 ( ptrace 函数 | 读寄存器 | 写寄存器 )
  3. 关于eclipse中文注释乱码的问题
  4. 内置函数之sorted,filter,map
  5. c如何接收java指令_java指令和javac指令总结
  6. C#实现捕获当前屏幕截图(转)
  7. jsp 乱码问题原因
  8. mescroll vue使用
  9. css 设置背景图一半_CSS背景颜色 背景图片 居中 重复 固定样式background经验篇
  10. 【mysql】浮点类型
  11. 第一章 基本架设服务器流程
  12. html5互动场景制作系统,春哥技术博客高仿易企秀H5场景应用制作平台源码V1.0正式版发布...
  13. win10自带搜索()带有括号或者特殊符号的方法
  14. 建设工程法规专科【7】
  15. 乔布斯的创新之道:换一种思考方式
  16. 营收净利同比上涨,甲骨文回“血”了吗??
  17. 江南大学计算机技术专业教学评估结果,江南大学学科评估结果及排名情况怎样...
  18. Android adb 安装 apk无法安装错误排查
  19. Python飞行追踪模拟
  20. 试题 算法训练 RP大冒险

热门文章

  1. 程序设计基础(CC++) 戴波、张东祥 第二章 数据类型与表达式 编程作业
  2. java验证电子邮件_Java字符串中电子邮件的简单易懂的验证
  3. 用一个小案例来解释linux中文件或目录的权限
  4. AJAX(看这一篇就够了,详细)
  5. python爬去智联招聘网_Python爬虫爬取智联招聘(进阶版)
  6. 课时05 Octave教程(Octave Tutorial)
  7. 读库小册子【一张照片】
  8. Java锁(二):AbstractQueuedSynchronizer、ReentrantLock详解
  9. 操盘手常用洗盘手法揭秘
  10. 安装 Adobe 软件报错,代码501