【100万用户量“排行榜列表”和“我的排名”功能优化记录】
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万用户量“排行榜列表”和“我的排名”功能优化记录】相关推荐
- 巴比特 | 元宇宙每日必读:上线三天,用户量突破100万,茅台推出“元宇宙”APP“巽风”,其核心玩法是什么?...
摘要:1月1日,茅台正式上线元宇宙平台APP"巽(xùn)风",开启了茅台元宇宙数字世界,据了解"巽风"上线仅三天,正式用户数量轻松突破100万.茅台元宇宙世界 ...
- linux中的vsprintf_Git29 年超 100 万次 commit,Linux 内核何以发展至今?
1991 年,21 岁的芬兰大学生 Linus Torvalds 写下第一行 Linux 内核代码时,多半没有想到它会成长为今天这样的庞然大物. 当年 8 月 25 日,Torvalds 在 Mini ...
- 《微SaaS创富周刊》第9期:如何把创业者访谈,变成年收入100万+美元的生意
导读 大家好!第9期<微SaaS创富周刊>面世啦(点击这里阅读第1期),感谢大家的关注和阅读!本周刊面向独立开发者.早期创业团队,报道他们主要的产品形态--微SaaS如何变现的最新资讯和经 ...
- 开发微信小程序,100 万开发者都离不开它
一种比较笼统的说法是,过去二十年,互联网彻底改变了人们的生活方式.但对这种影响人类吃穿住行的变革,再具体一点的说法是,"软件吞噬世界",互联网的背后是社交.电商.游戏.短视频等一个 ...
- 在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 ...
- 【干货】如果你的推广周期是一年,怎样激活100万目标用户
现在很多做App推广的新人或者刚接手一个App的推广项目,都会要求让写一个推广计划和目标,这个目标的设定要和你的推广周期相符合,比如你的推广周期是一年,你就要写一年内的推广目标,具体看设定的推广周期是 ...
- 100万“愤怒的小鸟”:中国手机开发者生存调查
2019独角兽企业重金招聘Python工程师标准>>> 在很多投身这一行业的开发者心中,都怀揣着一夜成名的梦想,希望有一天能做出像<水果忍者>.<愤怒的小鸟> ...
- 自己帮别人写的网站可以公开源码吗_雷军靠写代码赚第一个 100 万,马化腾亲自写腾讯网,码农出身的大佬...
作者 | 夏弢 本文经授权转载自创业邦(ID:ichuangyebang) 一提到程序员,很多人脑海里马上会出现这些刻板标签: 可事实上,有一个词似乎更能概括: 改变世界 程序改变世界,已经有几十年了 ...
- 100 万在中国不同地方能活多久?
最近,一张名为 "100 万在中国各省能生活多久?" 的图片在网上流传 话不多说,往下看 没错,就是正如你们看到的 天朝大北京 以"100万能活19年9个月"的 ...
最新文章
- 网站优化不仅仅只为排名而在!
- 【Android 逆向】代码调试器开发 ( ptrace 函数 | 读寄存器 | 写寄存器 )
- 关于eclipse中文注释乱码的问题
- 内置函数之sorted,filter,map
- c如何接收java指令_java指令和javac指令总结
- C#实现捕获当前屏幕截图(转)
- jsp 乱码问题原因
- mescroll vue使用
- css 设置背景图一半_CSS背景颜色 背景图片 居中 重复 固定样式background经验篇
- 【mysql】浮点类型
- 第一章 基本架设服务器流程
- html5互动场景制作系统,春哥技术博客高仿易企秀H5场景应用制作平台源码V1.0正式版发布...
- win10自带搜索()带有括号或者特殊符号的方法
- 建设工程法规专科【7】
- 乔布斯的创新之道:换一种思考方式
- 营收净利同比上涨,甲骨文回“血”了吗??
- 江南大学计算机技术专业教学评估结果,江南大学学科评估结果及排名情况怎样...
- Android adb 安装 apk无法安装错误排查
- Python飞行追踪模拟
- 试题 算法训练 RP大冒险
热门文章
- 程序设计基础(CC++) 戴波、张东祥 第二章 数据类型与表达式 编程作业
- java验证电子邮件_Java字符串中电子邮件的简单易懂的验证
- 用一个小案例来解释linux中文件或目录的权限
- AJAX(看这一篇就够了,详细)
- python爬去智联招聘网_Python爬虫爬取智联招聘(进阶版)
- 课时05 Octave教程(Octave Tutorial)
- 读库小册子【一张照片】
- Java锁(二):AbstractQueuedSynchronizer、ReentrantLock详解
- 操盘手常用洗盘手法揭秘
- 安装 Adobe 软件报错,代码501