设计千万级学生管理系统的考试试卷存储方案
一、完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构
Redis 的五种数据结构分析
1、String(字符串类型) Redis 的 key 和 value 长度最大均为 512M
2、Hash(哈希) 十分适合存储对象类数据
3、List(列表) 可重复的集合
4、set 无序不可重复的集合
5、zSet 有顺序不能重复的集合
试卷内容特点:可以看成是很大的一个字符串(大 JSON 转为字符串),因此可以使用 String 来存储
Key 的设计: 固定前缀_学校_学院_专业_课程_年级_试卷版本
示例:试卷_北京大学_计算机学院_计算机专业_计算机组成原理_2021_卷 A
说明:这里使用前缀是因为 redis 还可以缓存其他的数据,这里是为了方便区别缓存的数据是试卷
Key 设计的这么长,是为了根据 key 就能区分出试卷是哪个学校哪个学院哪个专业考的什么试卷
Value 设计:用一个很大的 String 来存储试卷内容
二、设计具体的读写流程(可以用文字描述也可以使用序列图描述,序列图要有文字辅助说明)
1、在考试开始之前(比如提前一周),需要将试卷内容初始化到 redis 中
2、学生进入考试页面,读取试卷信息时,从 redis 中直接获取
3、学生答题,可点击保存或提交,试卷内容和答案会写入 Hbase
三、对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能
Redis 读取试卷性能计算
1、根据 1000 万学生在一个月(20 天)内考完 20 科我们之前已经计算得出,在考试期间,试卷读请求的 QPS 为 5 万 / s
2、一张试卷内容假设最大为 20000 字符(假设都是中文),redis 使用 utf-8 编码存储,一个中文占 3 字节, 一张试卷大小 = 20000 * 3 = 60000 字节
3、内存读取速度分析,在内存中读取数据如 DDR4 为 50G/秒,即每毫秒可以读取 0.05G = 53687091.2 字节 / 毫秒, 一张试卷读取的时间 = 60000 字节 / 53687091.2 = 0.0011758 毫秒
4、单台 redis 服务 1 秒之内可以读取的试卷次数预估: 1000 / 0.0011758 = 8504847 次,即最大试卷读取的 QPS = 85 万/秒
redis 服务器集群数量(6 个节点)
由上面的性能计算可知,单台 redis 已经能够支撑试卷的读写请求,为了实现高可用
Redis sentinel 中,需要一个 master 节点、两个 slave 节点、3 个 sentinel 节点,因此是 6 个节点
评论