hw4- 千万级存储方案
试卷存储
如果按 String 存储,每天所有考试都有对应的 key。Key 太多查询速度太慢,不考虑。
List 是无序的,可以头插和尾插,插入的速度可以达到 O(1)。但是无序性导致查询的速度很慢。
对于 Hash,可以把考试的日期做 key,这天中每场考试做 hashKey,读写性能都可以。
普通 set 跟 list 一样,无序性导致查询的速度很慢。
Sorted set 有基于考试,和考试日期做 key 两种。试卷本身没有先后顺序,所以排序没有意义。
所以,把考试日期做 key,这天中每场考试做 hashKey 的 hash 的最优存储试卷的数据类型。当考试日期结束后,直接删除 key,减少遍历的 keys。
读写流程
教师上传试卷,学生开始考试时读取试卷。
性能估算
假设有 1000 万学生,每个学生平均每学期修 4 门课。这些学生的考试时间分布在 1 个月以内,一个月有 20 天可以考试,每天 4 场考试。请求试卷是在考试的前一分钟内完成,交卷是在最后三十分钟内完成。
试卷请求 QPS:1000 万 * 4(课)/ 20(天)/ 4(场)/ 1 分钟 = 50 万/分钟≈8000/s
提交试卷 QPS:1000 万 * 4(课)/ 20(天)/ 4(场)/ 30 分钟 =1.67 万/分钟≈278/s
“试卷请求”跟 Redis 有关,而“提交试卷”已经跟 Redis 无关了。QPS 8000/s 单机都能够扛下了。3 个 sentinels 是标配,所以标配就够了。
评论