模块四考试试卷存储方案
业务需求:
1000w 学生,每门学科考试 2 次,每个学生一年选 20 门课,考试方式采用机考,每门考试 20 道判断题、20 道选择题、4 道大题,每天进行 4 堂考试,每次考试集中在考试前 1 分钟访问。
复杂度分析:
试卷请求峰值:1000w/4(每天 4 堂考试)/60s=250w/60≈5w/s
单个试卷大小分析:一道选择题 50 个字,一道判断题 50 个字,一道大题 200 个字,一个字三个字节,一张试卷综合字数(50*20*2+200*4)*4btye=2800*4byte≈12000byte=12kb
单台 32 核机器,redis 性能为 5-10w。
综上分析,数据存储不属于高复杂度内容,访问才是。
redis sentinel 集群数量评估:
单台 32 核 48g 内存 redis 服务器足够支撑该业务。因为架构使用的 redis sentinel 部署结构,sentinel 高可用部署需要 3 台集群机器满足 sentinel 选举投票,使用主从 2 台 redis 业务服务器做高可用。
数据结构:
因为单个试卷内容大小可能超过了 12kb,为避免大 key 对 redis 性能的影响,需要将单个试卷的内容拆分成选择题、判断题、大题三个 key。因为是机考,为避遍所有人拿到的题目顺序一样,选择使用 set 进行存储试卷内容,这样每次获取到的题目顺序可能为不一样。
数据存储:
使用 set 数据结构存储和 sorted set 数据结构存储
key 设计:[t(老师)、s(学生)]:科目 ID:考试次数:[选择题、判断题、大题]
value:存储对应的考试题目
因为存储题目的时候,是由老师进行录入所以可能涉及对试卷数据的新增、修改、删除,所以在老师这里显示存储的时候使用 sorted set,方便老师对考试卷的数据进行处理。
在老师修改完考试数据之后,在创建供学生查询使用的 set 数据。
数据获取:
每次老师获取的数据都是通过 key:t:科目 ID:考试次数:[选择题、判断题、大题]获取排序后无变化的题目
每次学生获取的数据则是通过 key:s:科目 ID:考试次数:[选择题、判断题、大题]获取对应的题目
评论