架构实战营 - 模块 4 作业
设计千万级学生管理系统的考试试卷存储方案
【作业要求】
基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:
• 完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构。
• 设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)。
• 对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能。
【提示】
1. 性能可以有一定冗余。
2. 如果对 Redis sentinel 不熟悉,请参考官方文档:https://redis.io/topics/sentinel。
方案 1 - String
Key: 学校 ID + 学科 ID + 年级 ID +考试类型 ID + 年 + 版本号
Value:选择 String,为 JSON 格式
具体方案:
新增试卷:需要判断 Key 是否存在,不存在则尾部追加。
修改试卷:通过 Key 读取试卷,通 JSON 字符串解析成对象,对象修改后再转化为 JSON 字符串覆盖原来的 value 保存。
删除试卷:通过 Key 删除试卷
读取试卷:通过 Key 读取 value(JSON 字符串),通过 JSON 字符串解析成对象
方案分析:
修改试卷需要将大串的 JSON 字符串解析成对象,而对象里包括了单选题,多选题,大题,如果只是修改其中一项,也会全部修改。另外解析长字符串 JSON 也相当消耗性能。
方案 2 - Hash
Key: 学校 ID + 学科 ID + 年级 ID + 考试类型 ID + 年 + 版本号
Filed:字段: 单选题,多选题,大题,答案
Value:JSON 格式
具体方案:
新增试卷:需要判断 Key 是否存在,不存在则尾部追加。
修改试卷:通过 Key 读取试卷,将单选题,多选题,大题分别用 JSON 字符串解析成对象,对象修改后再转化为 JSON 字符串,覆盖原来需要修改的 Field。
删除试卷:通过 Key 删除试卷
读取试卷:通过 Key 读取试卷,将单选题,多选题,大题分别用 JSON 字符串解析成对象
方案分析:
通过 Field 拆分每 JSON 字符串,这样 JSON 解析的性能得到部分提升。
性能分析:
写性能:TPS 5 万 ,一台写服务器
读性能:TPS 10 万,两台读服务器
评论