一、场景介绍
公司要做这3类排行榜,分数排行榜,金币排行榜,输赢排行榜。然后这3类排行榜要分今天的和昨天的,输赢排行榜的数据要从mongoDb里面统计读取。数据库用的是sql server ,语言是php7.2,要求是3000的并发量。
二、初步思路
1.建立的数据表
2.建立定时任务 每天0点 运行如下存储过程 把昨天的数据清零初始化
将今天的输赢以及单次赢最大的数据更新到昨天的输赢以及单次赢最大上面去,并且把今日的除了score外的数据清0
3.建立定时任务 每30分钟去mongodb统计用户的总输赢等(记录最后一次读取的位置,下次读取的时候从此处往下读)
4.前端来获取用户的排行榜的时候去根据类型去计算用户的排名 以及前100名的人员的昵称和分数
三、并发测试
空载状态
1.apache-jmeter-5.2.1 测试100个并发 5分钟 12万个请求 cpu 和 负载瞬间上100 下面是测50个并发
这次只用了50个并发效果不是特别明显 ,100个的话负载和cpu绝壁100%
四、针对排行榜的优化
1.每一天0点的计划任务不变
2.还是每30分钟去统计用户的输赢到用户表中,然后把每个类型的排行榜前100名取出来并存入Redis,然后根据最后登录时间来算出每个活跃用户的排名数据存入Redis
3.客户端来请求的时候直接把Redis的数据取出来丢给它
五、优化之后能够达到200个并发 负载有所减缓,但是cpu依然是100% 感觉变化不是很大
六、问题
1.像这种排名的数据能够丢到redis还算好,但是像其它不好放进缓存的数据接口怎么办呢?
2.我50个并发访问sqlserver数据库的时候数据库服务器已经卡得不要不要的了 5分钟请求数12万,(只从一张10条数据的表里面查了一条数据)
3.是我使用有问题吗,记得数据库不是最少都是好几万的并发吗?
七、欢迎大神留言