架构实战营模块四作业
考试试卷存储方案设计
一、redis 数据结构
试卷内容
类型:string
key: 试卷 id
value:试卷 json 字符串
过期时间:依赖实际的考试时效来确定
理由:
试卷内的题目数量一般不会太多,不会造成 redis 大 key 问题,直接使用 string 来存储即可,简单高效。
考试列表
学生登录后,根据学生选择的课程信息班级信息会看到待考试列表
类型:zset
key: 班级 ID/课程 ID 具体取决于考试的维度,以班级为单位组织考试就存储班级 id,以课程为单位组织考试就存储课程。
field: 考试元数据信息 json(考试 id、试卷 id、考试分数、考试开始时间、结束时间等)
score: 考试开始时间戳(秒级)
过期时间:数据量不大,可不设过期时间;或者在 mysql 中存储数据,支持穿透到 mysql 读取这部分数据
理由:
1.考试列表支持按考试开始时间排序
2.高效的清理过期的考试
二、读写流程
学生获取考试列表
1.学生查询考试系统获取考试列表
2.考试系统查询本地缓存,如果没有就穿透到 redis 查询结果,将结果缓存到本地,缓存 5 分钟。
3.考试系统将考试列表返回给学生。
学生获取试卷
1.学生查询考试系统获取试卷信息
2.考试系统查询本地缓存,如果没有就穿透到 redis 查询,本地缓存 5 分钟
3.考试系统将试卷信息返回给学生
添加考试
1.教务在管理后台创建考试。
2.考试系统将考试信息和试卷信息存储到 redis 中。
三、服务器数量和性能
服务器数量
Sentinel 节点
数量:3 台(保证高可用,奇数保证选主)
规格:4 核 4G 服务器
redis 数据节点
数量:2 台,1 主 1 从
规格:2 核 8G 服务器
性能
sentinel 节点主要是管理 redis 集群的心跳和选主,不会存在性能问题。
redis 节点 2 核 8G 的 1 台服务器足够支持 5 万 qps 的访问,再加上我们在应用服务器上增加一层本地缓存,穿透到 redis 上的请求就更少了,2 台服务器来做 1 主 1 从保证集群的高可用。
评论