写点什么

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

用户头像
Rabbit
关注
发布于: 刚刚

一、完善 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 个节点


用户头像

Rabbit

关注

还未添加个人签名 2018.07.17 加入

还未添加个人简介

评论

发布
暂无评论
设计千万级学生管理系统的考试试卷存储方案