ITOO考评学生端性能优化——Redis

2024-08-27 15:18

本文主要是介绍ITOO考评学生端性能优化——Redis,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【项目背景】

    1.学生抽题慢
    2. 做学生端的时候发现学生每次做一道题的时候触发一次数据库,把数据更新到数据库里面,这样子学生端前台响应很慢,每次点击的时候都有1-2秒的延迟。然后当学生多的时候,不断的对一张表进行更改,大家都懂得。


【解决方案】

    (加Redis)

1. 把共用的东西放到Redis里面

2. 师姐的意思大体是这样子的,我每次更新的时候并不是更新的数据库,而是Redis,一段时间后内容把整个都提交到数据库里面。(反正原话我已经忘记了……)

【代码展示】


       1. 关于问题1

            其实解决抽题中的公共部分,而且给的文档很详细很简单:

    
/**
* 代码逻辑:
* 首先查看Redis是否有题型
* 如果有的话,直接读取Redis的内容,如果没有的话,就去数据库里面查
**/
public void queryComponentById(HttpServletRequest request,
HttpServletResponse response) {
System.out.println("进入查询组件方法");
String perSortTypeId = request.getParameter("questionTypeId");
if (perSortTypeId == null || perSortTypeId.equals("")) {
return;
}
// jediscluster.del(perSortTypeId);
// 定义题型集合
List<QuestionTypeDetail> questionTypesDetailList = new ArrayList<QuestionTypeDetail>();
String getQuestionTypeDetail=jediscluster.get(perSortTypeId);
if (getQuestionTypeDetail==null || getQuestionTypeDetail.equals("")) {
questionTypesDetailList = examPageBean.queryComponentById(perSortTypeId, dataBaseName);
if (questionTypesDetailList==null || questionTypesDetailList.equals("")) {
System.out.println("没有相应的题型组件");
}else{
try {
jediscluster.set(perSortTypeId,JsonUtils.objectToJson(questionTypesDetailList));
} catch (IOException e) {
e.printStackTrace();
}
}
}else{
JsonUtils.jsonToList(getQuestionTypeDetail, QuestionTypeDetail.class);
}
JacksonJsonUntil.beanToJson(response, questionTypesDetailList);
 
主要用到的Redis的代码例子:
    
//添加list
@RequestMapping("test4")
public void test4(HttpServletRequest request,
HttpServletResponse response) throws Exception {
jediscluster.set("listkey" ,JsonUtils.objectToJson(list));
}
     
//查询list
@RequestMapping("test6")
public void test6(HttpServletRequest request,
HttpServletResponse response) throws Exception {
List<EnrollStudent> enrollStudentList = new ArrayList<EnrollStudent>();
//获取缓存
String json = jediscluster.get("listkey");
//将json转化为list
enrollStudentList = JsonUtils.jsonToList(json,EnrollStudent.class);
}

    2. 关于问题2

     昨天才接触Redis,我还比较单纯,已经对于Redis的操作,只有文档上面的Get,set这两个方法。所以当郭郭跟我说,重名的时候,数据就会被覆盖了,我一测试,可不是嘛,于是我果断的用 perSortTypeId作为key值。
   
    但是,今天在查询的时候,才知道是因为我直接set,如果用list存储结构,用lpush()方法就能轻松解决问题了。但是也是因为关于底层Redis封装的方法太少了,用起来一直在各种转换。

    
/**
* 根据课程id,学生id,试卷id,数据库;查询考生答题记录;
* 十一期 谭倩倩
* 修改人:谭倩倩
* 修改原因:添加Radis
* @param request
* @param response
*/
@RequestMapping("/queryStudentRecord")
public void queryStudentRecord(HttpServletRequest request,
HttpServletResponse response)
{
//课程id
String CourseId= examineeArrangement.getCourseId();
//学号
String StudentCode = examineeArrangement.getStudentId();
//试卷id
String PaperId = examineeArrangement.getPaperMainId();
//数据库
String DateBaseName = "itoo_exam";
//查询考生答题记录
//把查询出来的学生答题记录保存用Radis下来_十一期 谭倩倩
List<PaperRecord> ListPaperRecord=new ArrayList<PaperRecord>();
String stuPaperRecord=examineeArrangement.getStudentId()+"ListPaperRecord";
// String getListPaperRecord=jediscluster.get(stuPaperRecord);
List<String> getListPaperRecord= jediscluster.lrange(stuPaperRecord, 0, jediscluster.llen(stuPaperRecord)-1); //lrange()方法是来查询出所有以stuPaperRecord为key健的值,上面说过因为是list结构存储。
if (getListPaperRecord==null || getListPaperRecord.equals("")||getListPaperRecord.size()==0) {
ListPaperRecord = paperRecordBean.queryAllStuPaperRecord(CourseId, StudentCode, PaperId, DateBaseName);
for (int i = 0; i < ListPaperRecord.size(); i++) {
PaperRecord enPR=ListPaperRecord.get(i);
try {
jediscluster.lpush(stuPaperRecord, JsonUtils.objectToJson(enPR));
} catch (IOException e) {
// TODO:单个实体存入Redis
e.printStackTrace();
}
}
}else{
// List<PaperRecord> changeRecord= (List<PaperRecord>)getListPaperRecord;
ListPaperRecord.clear();
for (int i = 0; i < getListPaperRecord.size(); i++) {
PaperRecord enPaRecord=JsonUtils.jsonToPojo(getListPaperRecord.get(i), PaperRecord.class);
ListPaperRecord.add(enPaRecord);
}
}
JacksonJsonUntil.beanToJson(response, ListPaperRecord);
}

    
重点逻辑:
  1. 获取Redis存储数据的个数作为循环的条件
    把list的每个实体查询出来,匹配对应的答案,
    更新list里面的数据
//缓存更新
List<PaperRecord> stuListPaperRecord=new ArrayList<PaperRecord>();
String stuPaperRecord=examineeArrangement.getStudentId()+"ListPaperRecord";
long count=jediscluster.llen(stuPaperRecord);//获取Redis存储数据的个数
// stuListPaperRecord=JsonUtils.jsonToList(StrListPaperRecord,PaperRecord.class);
if (count==0) {
examPageBean.updatePaperRecord(studentAnswer, questionId, score,teacherCode, examineeArrangement);
}else{
//更新缓存,
for (long i = 0; i < count; i++) {
//TODO:自己测试用
String strPR=jediscluster.lindex(stuPaperRecord, i);
// int i=(int)count;
// PaperRecord enPaperRecord=stuListPaperRecord.get(i);
// if (getEn.length()>0) {
// PaperRecord paperRecord=new PaperRecord();
PaperRecord paperRecord=JsonUtils.jsonToPojo(strPR, PaperRecord.class);
if (paperRecord.getQuestionContentId().equals(questionId)) {
paperRecord.setStudentAnswer(studentAnswer);
String jsonPaRecord;
try {
jsonPaRecord = JsonUtils.objectToJson(paperRecord);
jediscluster.lset(stuPaperRecord, i, jsonPaRecord);//更新Redis里面的数据
System.out.println("答题记录写入缓存成功");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


总结:

     其实,我是在点击“交卷”的时候把数据存储到数据库的。
       我感觉我的Redis仅仅是用了一点点,并没有很好地利用。以后有机会自己再多学习一下,感谢我老公和红霞给我各种指导和建议。
     还有,就是不要仅仅依赖技术文档。这次我明显感觉到文档给我的满足不了业务需求,不要尝试用自己的简单逻辑处理,先去查查网上有没有好的方法。




这篇关于ITOO考评学生端性能优化——Redis的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112033

相关文章

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Redis MCP 安装与配置指南

《RedisMCP安装与配置指南》本文将详细介绍如何安装和配置RedisMCP,包括快速启动、源码安装、Docker安装、以及相关的配置参数和环境变量设置,感兴趣的朋友一起看看吧... 目录一、Redis MCP 简介二、安www.chinasem.cn装 Redis MCP 服务2.1 快速启动(推荐)2.

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri