千万学生管理系统试卷存储方案
【数据结构设计】
使用 Redis 的 String 数据类型作为存储。
key: 课程 ID:学期:批次编码
value:json 格式存储为字符串
【持久化策略】
试卷数据比较重要,redis 更适合做缓存,因此考虑将试卷数据写入 MySQL 一份作为持久化存储;
此处可以使用 Write behind 机制,由服务端线程异步写入 MySQL
【读写分析】
1.老师提交设计好的试卷,试卷序列化成 json 格式存储至 redis 中;异步线程会同步试卷数据至 MySQL
2.考试开始,学生请求试卷,先通过课程、学期、批次编码组合成 key 查询 redis 中的试卷信息
【性能、容量预估】
试卷存储空间评估
假设平均每道题 300 字,那么平均每张试卷:44(题数)* 300(字数)* 3(字符编码)=38K 左右,考虑存储为 json,按 40K 来算;
假设平均一个大学在校人数 4 万人,1000 万学生预计 250 所高校。假设每所高校每年 200 门课程要考试
250(高校)* 200(课)* 2(考试次数)* 40k(试卷大小)= 4G 左右;
考虑到估算误差及扩展需要,建议 redis 内存配置至少 8G,推荐 16G 以上;
性能评估
redis 单机读取简单 kv 结构能轻松到万,甚至十几万;试卷请求预计 5W/s 的 QPS,因为数据结构并不是特别复杂,所以预计单机的性能即可满足;
网络带宽预估:40K(试卷大小)* 5W/s = 2Gbps 左右
但是因为考虑到高可用,需要采用 sentinel 架构,所以最后的配置是:
Sentinel 节点:3 个组成高可用集群,实现自动切换;
数据节点:一主一丛,主从要同样的配置,组成复制架构,配置均为 4C16G;
带宽:至少保障带宽 2Gbps 以上;
版权声明: 本文为 InfoQ 作者【intelamd】的原创文章。
原文链接:【http://xie.infoq.cn/article/d4c4ce734efd3081a5d155834】。文章转载请联系作者。
评论