您的位置:首页 > 数据库 > Memcache

【dictionary】+【memcache缓存】-优化性能

2016-05-29 21:37 441 查看
    dictionary和memcache是我在评教项目中应用到的。

背景:

    对评教系统进行测试发现:影响系统性能的主要原因在:调用接口。每次调用接口,都要花费接近2s的时间。比如:从基础查询教师课程信息。每评完一科都要查询一次。这样,平均每个学生10门课,则整个过程至少耗费20s。所以这是一个很大的优化空间。

方案:

    对于这个场景,首先想到的就是用memcache加缓存,减少对接口的访问。第一个学生登录时,就将所有教师课程信息加到memcache。之后的所有学生都从memcache读数据。因为把所有教师课程信息都读取过来,数据太多,所以最终选择的是第一个学生登录时,将其学院的所有教师课程放到缓存,虽然将整个学院的数据拿过来,耗时相对(取单人数据)较长,大约为8秒。但除第一次调接口,其他从缓存拿数据都在几ms的级别。所以,这是一个可行的方案。

    这步解决了,下一个问题就是:原来接口返回一个学生对应的所有教师课程信息,那返回一个list集合就可以了,但现在返回该学院所有学生对应的教师课程,单纯的集合就不方便了。所以想到了用dictionary,它也是键值对的形式传数据,这样就可以将学号+字符串当键,值为相应的list集合。并且从dictionary读数据比list更高效。

代码:  

#region 学生的教师课程信息memcache、dictionary-赵寒-2016-5-22
public List<CurriculumentViewModel> queryStuCouTea (StudentViewModel studentinfo)
{
List<CurriculumentViewModel> listCorsTeaInfo = new List<CurriculumentViewModel>();
Dictionary<string, List<CurriculumentViewModel>> dicCourseTeaInfo = new Dictionary<string, List<CurriculumentViewModel>>();

//查看服务器1是否存在diction
bool flag1 = MemcacheHelper.IsServersExists("server1", "pingjiao" + studentinfo.StudentID+ "CourseTeacher");
if (flag1)
{
//服务器1存在
listCorsTeaInfo = (List<CurriculumentViewModel>)MemcacheHelper.GetCounterFrom("server1","pingjiao" + studentinfo.StudentID+ "CourseTeacher");
}
else
{
//服务器1不存在
bool flag2 = MemcacheHelper.IsServersExists("server2", "pingjiao" + studentinfo.StudentID + "CourseTeacher");
if (flag2)
{
//服务器2存在
listCorsTeaInfo = (List<CurriculumentViewModel>)MemcacheHelper.GetCounterFrom("server2","pingjiao" + studentinfo.StudentID+ "CourseTeacher");
}
else
{
//不存在,则查基础wcf放缓存

dicCourseTeaInfo = baseController.QueryEvalInfoByStudentId(studentinfo.StudentNo);
//将每条数据存入
foreach (string key in dicCourseTeaInfo.Keys)
{
//key:"pingjiao" + dicCourseTeaInfo[i].StudentID + "CourseTeacher"
listCorsTeaInfo = dicCourseTeaInfo[key];
MemcacheHelper.SetTo("server1", key, listCorsTeaInfo);
MemcacheHelper.SetTo("server2", key, listCorsTeaInfo);
}
listCorsTeaInfo = dicCourseTeaInfo["pingjiao" + studentinfo.StudentID + "CourseTeacher"];
}

}

return listCorsTeaInfo;
}
#endregion

总结:

    通过这样的优化,2万人参加评教,15个学院的学生,每个学生5门课,在查询教师课程方面就会节省:(2万*2s*5-15*8s)=(20万-120)s=55小时=2.3天

    oh,my god.这个数这是刚刚算的,真的被惊到了。这样看来,若没有经过这样的优化,这次评教定是上不了线了....(因为整个评教就安排了2天,若是原来的速度,单纯读出数据就需要2天半......)

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: