写点什么

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

作者:炎彬
  • 2022 年 3 月 06 日
  • 本文字数:905 字

    阅读完需:约 3 分钟

0.背景知识


1.数据结构设计

Redis 中常用的 5 种数据结构:字符串、List、Hash、Set、SortedSet。

考试的试卷内容,试卷确定之后,一般是不会变化的,再就是考试的试题是按照顺序进行排序的,所以试卷内容采用 List 数据结构进行存储,缓存的 Key 由学校 Code+学年+学期+考试科目 Code,每一项信息之间通过下划线“_”分隔开,比如 2021 学年下学期清华大学(学校 code:010001)计算机组成原理(课程 code:10086)科目考试的 Key 为:

010001_2021_02_10086


2.缓存读写流程

2.1 试卷缓存写

试卷缓存写入的时机,当出卷人确定试卷之后,录入系统之后,生成一条 List 数据结构的缓存,缓存 Key 按照 1 中设计的数据结构生成,缓存 Value 将试题按照题目顺序转换成 json 结构保存到 List 中。

2.2 试卷缓存读

考试的时候,学生登录考试系统,开始考试之后,试题内容从 Redis 缓存中根据试题的科目生成的缓存 Key 取出试题内容,可以按照下标一个一个的取出,也可以按照下标批量或者全部将试题取出,具体读出试题的规则看考试系统前端页面的展示形式来定。

3.Redis Sentinel 集群规模

一套试卷内容(20 个判断题+20 个选择题+4 个大题)占用内存的大小的估算,假设一道判断题平均由 50 个字符组成,一个选择题和选项平均由 150 个字符组成,一个大题平均由 200 个字符组成,另外一套试卷中平均出现 10 张图片(每张图片大小 1M),则一套试卷占用的内存:

判断题:20*50*2byte = 2000byte = 2M

选择题:20*150*2byte = 6000byte = 6M

大题:4*200*2byte =1600bye = 2M

图片:10*1M=10M

所以一套试题占用的内存大小估算为:20M。


按照每个学校平均 4 万人来算,1000 万学生,分散在 250 所学校中,每个学生每学期平均学习 20 门课程,前 3 年的学生都需要考试来计算总的试题数量:250*20*3=15000,即 15000 门课程。


因为试卷的缓存只需要在考试阶段保存,考试结束之后,缓存就可以删除了,所以每年只需要在学期末考试的时候将试题内存保存在缓存里,只需要算一个学期的试卷大小即可,这样算下来,总的试卷缓存大约是:15000*20M/1024 = 300G


根据请求试卷的 QPS 为 5 万/秒,再加上缓存的数据量比较大,Redis 集群采用一主三从的集群规模,将读请求压力分散到 3 台从服务器中。


用户头像

炎彬

关注

还未添加个人签名 2021.08.26 加入

还未添加个人简介

评论

发布
暂无评论
千万级学生管理系统的考试试卷存储方案_「架构实战营」_炎彬_InfoQ写作平台