【dictionary】+【memcache缓存】-优化性能
2016-05-29 21:37
441 查看
dictionary和memcache是我在评教项目中应用到的。
这步解决了,下一个问题就是:原来接口返回一个学生对应的所有教师课程信息,那返回一个list集合就可以了,但现在返回该学院所有学生对应的教师课程,单纯的集合就不方便了。所以想到了用dictionary,它也是键值对的形式传数据,这样就可以将学号+字符串当键,值为相应的list集合。并且从dictionary读数据比list更高效。
oh,my god.这个数这是刚刚算的,真的被惊到了。这样看来,若没有经过这样的优化,这次评教定是上不了线了....(因为整个评教就安排了2天,若是原来的速度,单纯读出数据就需要2天半......)
背景:
对评教系统进行测试发现:影响系统性能的主要原因在:调用接口。每次调用接口,都要花费接近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天半......)
相关文章推荐
- linux安装memcached及memcache扩展
- CentOS 7 安装 PHP 7.0以及memcache和redis扩展
- nginx反代后端动静分离 php会话保持使用memcached
- memcached的部署与nosql介绍
- Ehcache Memcache Redis 初步 (一)
- Ehcache Memcache Redis 初步(二)
- memcache安装
- 分布式单服务器实例内存缓存
- ehcache memcache redis 三大缓存比较
- Mybatis无缝集成Memcached分布式缓存系统
- redis与memcached
- memcached安装时memcached: error while loading shared libraries:libevent-2.0.so.5: cannot 的问题解决
- memcache学习之c客户端
- ThinkPHP使用Memcached缓存数据
- NGINX配置从memcache中取静态页面
- centos6.5 安装memcached 代理服务器(Magent)
- 分布式缓存系统Memcached简介与实践
- nginx+tomcat+memcached网页动态请求分配的安装与配置
- 通过telnet连接查看memcache服务器
- 网易视频云技术分享:Facebook memcache优化经验