写点什么

模块四考试试卷存储方案

用户头像
kitten
关注
发布于: 3 小时前

业务需求:

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:考试次数:[选择题、判断题、大题]获取对应的题目

用户头像

kitten

关注

还未添加个人签名 2017.12.05 加入

还未添加个人简介

评论

发布
暂无评论
模块四考试试卷存储方案