写点什么

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

发布于: 刚刚
(mode4)千万级学生管理系统考试试卷存储方案
  1. 概述

学生管理系统中试卷的存储设计方案


  1. 需求汇总

试卷请求 QPS: 5w/s, 提交试卷 1700/s

试卷基本信息 CRUD 忽略不计

假设题库共 2w 道试题


  1. 方案设计


1)redis 缓存试卷信息,可考虑管理端开发手动预热功能,将各科目考试前预热加载到缓存 redis,提高读性能。


2)试卷读取

读操作先读 redis,redis 未命中情况下,查 mysql 并追加到 redis 缓存内,并返回(这里去数据库 load 数据环节可做为优化点,防止 redis 穿透到 mysql 造成 mysql 压力骤增,一期视工期时长而定)


redis 中试卷数据结构


主数据结构说明:
使用hash结构存储,存储该年级所有考试科目详细信息,供页面显示,比如时长,监考老师名称,科目说明等信息hset "grade" "course" json串
json串{ ”teachers“:“王老师 张老师 陈老师” ”desc“ :”考试需知“ ”total_time“ : "总时长" “grade” : "年级" “course”: “科目”}


试题结构说明:有序集合(sorted set)存储,使用考题序号做为score进行排序,方便分页查询,以及页面展示顺序
ZADD grade-course 序号1 quest1ZADD grade-course 序号2 quest2 [//考试试题 { "no":"序号1" "quest_no" : "试题编号“, "quest_type" : "试题类型(单多选判断选择填空) 1,2,3" "quest_comment":"试题内容" }, { "no":"序号2" "quest_no" : "试题编号-1“, "quest_type" : "试题类型(单多选判断选择填空) 1,2,3" "quest_comment":"试题内容-1" } ]



复制代码


3)落库时先落 mysql,再落 redis,如 redis 落库异常则 mysql 回滚


4)使用浏览器缓存考生考试中间结果,防止考生未提交或误操作或电脑断电等造成已答题目丢失


4、集群服务器数量


根据性能需求分析得最高 5w/s,redis 单机 10w,由于使用 sentinel 的方案,1 主两从,3 个 setinel 保证高可用,所以性能方面 3 个节点足够使用了。


所有年级学科共 20000 道考题 * 12k(假设题目 500 字所占存储大小) = 240M

其它业务缓存信息,读多写少,redis 建议 3 台 4C16G


发布于: 刚刚阅读数: 2
用户头像

还未添加个人签名 2017.10.11 加入

还未添加个人简介

评论

发布
暂无评论
(mode4)千万级学生管理系统考试试卷存储方案