写点什么

千万级学生管理系统的考试试卷存储方案

作者:凯博无线
  • 2022 年 4 月 30 日
  • 本文字数:1090 字

    阅读完需:约 4 分钟

1.作业要求

基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:

• 完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构。

• 设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)。

• 对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能。

【提示】

1. 性能可以有一定冗余。

2. 如果对 Redis sentinel 不熟悉,请参考官方文档:https://redis.io/topics/sentinel

 

2.估算结果

用户量: 1000 万。

【考试】

1. 在校学生考试结果存储:2.4T;

2. 离校学生考试结果存储:每年增长 0.6T;

3. 试卷请求 QPS:5 万/s;

4. 提交试卷 TPS:1700/s。

3.redis 数据结构



4.考试试卷存储方案

4.1.redis 数据结构选择

试卷存储层数据结构:

学校 ID --> 专业 ID --> 考试 ID --> 题目

 

redis 主要的 5 种数据结构:string、hash、list、set、sorted set,因考试试卷的题目是不能重复的,且题目顺序确定,所以选择有序集合 sorted set 作为试卷存储数据结构。

Key: 学校 ID+专业 ID+考试 ID

Score: 题目序号

Member: 题目

 

4.2.存储大小选择

单个试卷大小评估:假设试卷有 30 道选择题, 10 道简答题。 

每道选择题题目和选项 200 个汉字, 编码方式为 utf8,则占用大小为 2*300=600 字节, 考虑其他元信息, 算 700 字节,则占用大小为: 700*30=21KB. 

每道简答题题目 300 汉字, 编码方式为 utf8,则占用大小为 3*300=900 字节, 考虑其他元信息, 算 1KB, 1KB*10=10KB.

 

综上:每张试卷占用 31KB, 考虑有一些题目有图片, 平均每条 100 字节, 20 张图片, 需要 2KB, 考虑其他一些信息, 每张试卷计为 35KB.

 

Redis string 类型可以存放 512MB 数据,存放试题足够。

 

根据估算结果 1000 万的用户,假设每个学校平均 5 万人,每所大学平均有 100 个专业,每个专业设置一学期设置 10 门课程,则每学期的考试种类为:

(1000/5)*100*10 = 20 万张试卷。

总的存储大小为:

20 万 * 35KB = 7000000KB = 7GB

按照目前市面常规的内存规格,8/16/32GB, 操作系统运行本身需要占用部分内存,故 8GB 不足以满足需求。

16GB 满足需求。

4.3.Redis sentinel 集群数量和性能

根据 redis 单机性能 5W~10W 以及 QPS 估算为 5 万/s,则单台 16GB 的服务器即可满足需求,为了提供系统的可用行,采用最低集群数量 3 台即可(单数防止脑裂)。

因 16GB 相对于总存储容量 7GB 而言足够, 故将三台 sentinel 与三台 redis 实例混部,总共采用 3 台 16GB 的服务器即可。


4.4.读写流程

1.教师将试卷写入 mysql 中。

2.在考试的前一天将试卷从 mysql 中缓存到 redis 中。

3.学生考试时从 redis 读取试卷即可。


用户头像

凯博无线

关注

还未添加个人签名 2021.08.29 加入

还未添加个人简介

评论

发布
暂无评论
千万级学生管理系统的考试试卷存储方案_凯博无线_InfoQ写作社区