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

    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天半......)

   

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值