关于在线答题系统设计的一些想法
文章目录
- 业务场景
- 需求分析
- 设计思路
- 打乱题目顺序
- 数据都存储在本地
- 基于Mysql的系统设计
- 生成随机题目
- 记录用户答题结果
- 记录用户操作日志
- 排行榜的显示
- 交卷操作
- 基于Redis的系统设计
- 记录用户答题结果
- 记录用户日志
- 排行榜的显示
- 压力测试
业务场景
- 100道不定项选择题,不同考生的题目顺序不一样
- 200位考生在规定时间同时开始和结束答题
- 考试开始后可以查看题目列表,不一定要按照顺序作答,已作答的题目可以修改,最终分数以交卷时的分数为准
- 在考场后台的办公室中可以实时刷新分数的排行榜
- 考试环境为学校的机房,网络环境为局域网
- 考试题目为文学类知识竞赛,考生准考证号和身份证号分别作为用户名和密码
需求分析
1、为了避免相互抄袭,不同考生的题目顺序需要不一样,这里需要打乱题目的顺序。
2、考试开始作答的时间可能不同,但是都要在统一的时间截止答题,这就要求考生的机器需要统一时间,能够在考试结束后自动提交。
3、在考试过程中要能够查看分数排行版,这里可以在考生每回答或者更新题目的时候都去刷新排行榜,或者在管理段定时刷新的时候再去计算所有考试的分数和排行榜情况。
4、考试环境为本地局域网,考试过程中有监考老师进行巡逻,并且考试群体大多不具备计算机知识,这里可以基本排除考生进行抓包后主动调用接口的场景。
设计思路
打乱题目顺序
1、使用mysql的随机排序方法,ORDER BY RAND(准考证号)
2、在用户首次登录时,可以使用php的shuffle($arr)
函数将题目顺序打乱后返回,并将打乱后的数组顺序再次存储到数据库中。
##统一时间交卷
交卷时间是确定的,我们要以服务器时间为准,用户机器上的时间不可靠。用户的每次请求的返回中,我们都给返回给用户一个交卷的截止时间,前端的js就基于该截止时间显示考试的剩余时间。在后端我们需要记录每个考生的交卷时间,在截止时间到达后不能再提交。
由于考试开始和结束时间都是一样的,所以这时候的并发了会比较大,我们可以让用户随机延迟5s以内,通过阅读考场规则或者增加loading图的方式可以优化交互体验。
数据都存储在本地
考虑到用户都是不具备计算机知识的,网络是局域网络,且现场有监考老师的存在,可以基本排除有用户会抓包或模拟请求的可能。
在用户登录后,查询题目列表时也把题目的答案返回给用户,这里可以将答案做一个简单的加密。在用户答题后可以根据答案计算用户当前的得分,只更新用户的得分,用户后台的显示。在用户交卷时再将本地数据全部上传到接口,这样最多在用户交卷时会有卡顿,在用户答题过程中还是非常流畅的。
这个场景比较特殊,存在很大的安全隐患,除非接口性能实在不能满足,最好还是不要使用。
基于Mysql的系统设计
生成随机题目
SELECT title,option1,option2,option3,option4 FROM questions ORDER BY RNAD('准考证号')
在用户登录后,将题目一次性取出,如果担心用户不小心关闭了浏览器或者电脑断电的话,cookie只能存放4k的数据,并且会随着请求发送,增加请求耗时,可以将数据存储到localStorage中。
用户作答或修改答案时都会调用接口,所以即使用户关闭了浏览器,再次打开重新登录的话,也是能够保存之前的答题记录的,只需要重新拉取一份题目列表就可以了。
记录用户答题结果
key questionId answer time
按照这种格式记录用户每道题目最后一次更新的答案,并记录用户的最后一次更新时间。
记录用户操作日志
为了后期复盘,我们需要记录用户的登录、退出、交卷、答题和修改的操作日志,为了不影响接口的响应时间,我们可以将日志序列还之后添加到List里面,也可以使用redis或者RambbitMQ的消息队列来异步记录日志。
排行榜的显示
1、在用户作答或者更新题目的时候计算用户的分数的话会影响答题接口的响应时间。
2、当管理端刷新排行榜时计算所有用户的分数,需要读取200*200条答题记录,计算分数并更新到数据库,然后进行排序后输出,短时间进行大量的数据操作会对数据库产品一定的压力,进而影响考试插入答题记录的速度。
3、我们可以采用swoole、redis或者RambbitMQ的消息队列,将第一种方案的接口请求立即返回,然后通过异步任务计算该考生的分数,并更新到数据库中。管理端的排行榜直接读取数据库中的成绩表,排序后显示。这里的消息队列和日志一样,即使消息丢失了也不会有什么大的影响。
交卷操作
在用户交卷时,我们可以直接调用php方法进行考生成绩的同步计算,为了避免同一时间很多考生同时调用接口,可以随机等待3s,然后再调用交卷接口。
基于Redis的系统设计
记录用户答题结果
使用Hash结构存储答题结果
HMSET 20201001 12 ab
- 使用考号作为redis的key
- 使用题目id作为hash的key,考生答案作为value
记录用户日志
使用List结构存储用户操作日志
排行榜的显示
在用户提交或更新题目时通过消息队列异步处理,通过HMGET 20201001
获取该用户所有作答的题目,然后对比正确答案得到最终分数。
redis的排序有两种实现方式,分别是有序集合和Sort命令。
- 有序集合(ZSet)
ZADD grades 35 201101
ZADD grades 96 201103
ZADD grades 85 201105
ZRANGE grades 0 200 WITHSCORES
- 列表(List)+ Sort命令
//插入考号
lpush users 201101,201102,201103
//使用包含统一前缀的key
set grades:201101 98
set grades:201102 79
set grades:201103 89
//将list中的item拼接到统一前缀后面,根据对应的value进行排序
sort users by grades:*
sort users by grades:* get grades:*
Sort命令:http://doc.redisfans.com/key/sort.html
压力测试
除了企业级的压力测试工具以外,用的比较多的是ApacheBench和JMeter。
- ApacheBench应用的最为广泛,不支持动态参数,如果需要模拟不同用户的请求,需要改造接口自动使用不同用户身份进行请求。
- JMeter是基于java的GUI测试工具,也可以命令行调用,支持动态配置参数,可以直接模拟不同用户身份。
ab测试工具:https://www.cnblogs.com/stulzq/p/8971531.html
JMeter测试工具:https://www.cnblogs.com/stulzq/p/8971531.html
关于在线答题系统设计的一些想法相关推荐
- java计算机毕业设计基于vue框架的疫情防控知识在线答题系统设计与实现源程序+mysql+系统+lw文档+远程调试
java计算机毕业设计基于vue框架的疫情防控知识在线答题系统设计与实现源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计基于vue框架的疫情防控知识在线答题系统设计与实现源程序+m ...
- 【附源码】计算机毕业设计java在线答题系统设计与实现
项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...
- 关于魔兽世界战斗系统设计的一些想法
1 抗性--等级相关还是等级无关 PS 等级相关是指属性随等级增长而变化,而等级无关是指属性变化与等级无直接关系. TBC带来的,首先是等级上限提到70,而此带来的是等级相关属性值的飞涨.鉴于等级无关 ...
- java毕业设计校园招聘系统设计mybatis+源码+调试部署+系统+数据库+lw
java毕业设计校园招聘系统设计mybatis+源码+调试部署+系统+数据库+lw java毕业设计校园招聘系统设计mybatis+源码+调试部署+系统+数据库+lw 本源码技术栈: 项目架构:B/S ...
- JAVA计算机毕业设计基于vue技术的汽车维修检测系统设计与实现源码+数据库+系统+lw文档
JAVA计算机毕业设计基于vue技术的汽车维修检测系统设计与实现源码+数据库+系统+lw文档 JAVA计算机毕业设计基于vue技术的汽车维修检测系统设计与实现源码+数据库+系统+lw文档 本源码技术栈 ...
- JAVA毕业设计数字家谱管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
JAVA毕业设计数字家谱管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计数字家谱管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构 ...
- java-php-python-springboot校园课室资源预约系统设计与实现计算机毕业设计
java-php-python-springboot校园课室资源预约系统设计与实现计算机毕业设计 java-php-python-springboot校园课室资源预约系统设计与实现计算机毕业设计 本源 ...
- 计算机毕业设计Java高校学生智慧党建系统设计与开发(源码+系统+mysql数据库+Lw文档)
计算机毕业设计Java高校学生智慧党建系统设计与开发(源码+系统+mysql数据库+Lw文档) 计算机毕业设计Java高校学生智慧党建系统设计与开发(源码+系统+mysql数据库+Lw文档) 本源码技 ...
- 计算机毕业设计Java公司配件库存管理系统设计与实现(源码+系统+mysql数据库+Lw文档)
计算机毕业设计Java公司配件库存管理系统设计与实现(源码+系统+mysql数据库+Lw文档) 计算机毕业设计Java公司配件库存管理系统设计与实现(源码+系统+mysql数据库+Lw文档) 本源码技 ...
- JAVA计算机毕业设计校园线上点餐系统Mybatis+源码+数据库+lw文档+系统+调试部署
JAVA计算机毕业设计校园线上点餐系统Mybatis+源码+数据库+lw文档+系统+调试部署 JAVA计算机毕业设计校园线上点餐系统Mybatis+源码+数据库+lw文档+系统+调试部署 本源码技术栈 ...
最新文章
- SQL触发器demo
- SpringBoot2 Redis连接池
- Java定时任务解决方案
- java中list方法addall怎么写_简历中个人优势怎么写?| 四大方法教你打造独一无二“个人标签”...
- iOS开发之获取LaunchImage启动图
- 分布式系统关注点(3)——过去这几十年,分布式系统的「数据一致性」精华都在这了!...
- 宗地图绘制要求和规范_宗地图绘制的基本要求和内容.ppt
- PHP目录函数 opendir (打开目录句柄)
- 守望先锋四服务器修改,服务器刷新率提高 《守望先锋》终于不用死在墙角了...
- 服务器四核cpu性能排行,服务器cpu性能排行
- 大数据分析的学习感悟
- 20210726:FLAC刻录音乐CD教程05-总结
- [日推荐]『51好书推荐』专治假期综合症~
- 适配ipad Pro
- 图形数据库Titan-学习笔记
- 如何將人臉變漂亮(一)
- 3D立体相册不过是冷锋蓝plus版 html+css
- 【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介
- windows10访问Ubuntu ext3文件
- Greenplum【集群搭建 02】cgroup工具安装+用户资源组配置+集群资源组配置+数据库资源组配置+资源组相关信息(一篇学会资源组配置)