第四模块作业 - 设计千万级学生管理系统的考试试卷存储方案
性能分析
存储量:
每学期 20 门课 20 道选择 20 道判断 4 道答题
假设平均每道题加序列化标点共 1000 字符
一年试卷存储量为:2 次*20 门*(20 选择题+20 判断题+4 答题)*1000 字符/1024/1024 = 1.7MB
读写性能需求:
qps 5w/s
tps 1700/s
选择存储系统
Redis sentinel
设计存储方案
Redis 数据结构
分析:
单张试卷体积 (20+20+4)*1000/1024 = 40kb
试卷全部内容序列化,并做压缩处理可以缩小到 5~10kb
5-10kb 会影响 redis 性能,所以需要进一步做拆包(每包 1kb 以内)
方案:
试卷编号 + 拆分包序号为 key (XXAAA-1,XXAAA-2...)
value 为拆分后的包
按次方案存储,访问量会有 5-7 倍的增加,qps 5w -> 25w
具体的读写流程
写流程
试卷上传或编辑后保存到数据库
发布试卷时,提取数据库单张试卷全部数据,并进行压缩和拆包
拆包后按规则存入 redis
如需修改试卷,需要重新发布
读流程
学生浏览器登录后,进入准备考试页面,得到试卷编号及此试卷拆包的数量
开始考试后,浏览器访问服务器计算节点,获取试卷
计算节点通过试卷编号及包数量到 Redis 获取试卷全部内容,解压缩
计算节点本地缓存解压缩后内容 1 分钟,可控制 redis 读取性能在 3w/s 以内
前端获取到试卷内容,并显示试卷内容
Redis sentinel 服务器数量和性能
4 核 8g 服务器 单机性能约为 3-5w
本项目使用三台 4 核 8g 服务器,一个 master 两个 slaver
并分别在三台服务器部署 sentinel
版权声明: 本文为 InfoQ 作者【彦欲】的原创文章。
原文链接:【http://xie.infoq.cn/article/eddbf7cd82ac8f1404069e67d】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论