【ITOO】---基础接口(memcached应用)

    由于评教急需基础的接口,而基础短时间没有人写接口,所以我就暂时的去基础写评教的接口!也是因为这样,我又机会用到了自己研究了很久的memcached!
    以评教的登录为例!
     我们的需求是这样的: 评教登录系统的时候,需要从基础调该学生的信息。真正的评教的时候,大概有500多名学生一起登录评教系统!如果不断的开合数据库会给数据库造成巨大的压力,从而导致登录的时候出现超时的错误!所以我们就把这一部分学生信息放到memcached中!在写这个接口的时候基础的代码用到了原生sql。原生sql和memecached的结合最大限度的提高了查询速度,而memcached是搭建的集群,这样又最大限度的减少了数据库的压力!一举两得!

     下面上代码:
 
#region QueryStuInfoByStuNo() 利用memcached根据学号查询学生信息  李少然 2016-3-12 15:40:50
        /// <summary>
        /// 根据学号查询学生ID,学生姓名,学生班级ID
        /// </summary>
        /// <param name="StuNo">学号</param>
        /// <returns>list</returns>
        public List<StudentViewModel> QueryStudentInfoByStudentNo(string StuNo)
        {
            List<StudentViewModel> studentlist = new List<StudentViewModel>();
            //一个学生进来先判断memcached中有没有该学生的信息
            Boolean flag1 = MemcacheHelper.IsServersExists("Svr1", StuNo);         
            switch (flag1)
            {
                    //如果存在
                case true:
                    //从memcached中取出该学号的相关数据
                    studentlist = (List<StudentViewModel>)MemcacheHelper.GetCounterFrom("Svr1", StuNo);
                    break;
                    //如果不存在
                case false:
                    //判断该服务器中的表是否存在
                    Boolean flag2 = MemcacheHelper.IsServersExists("Svr1", "studententities");
                    if (flag2 == true)
                    {
                        //从数据库中取出该信息放到集群中
                        studentlist = StudentBll.QueryStuInfoByStuNo(StuNo);
                        string studentNo = studentlist.Count == 0 ? "null" : studentlist[0].StudentNo;
                        MemcacheHelper.SetTo("Svr1", studentNo, studentlist);
 
                    }
                    else
                    {
                        //如果表也不存在,就查询服务器2中改学号是否存在                          
                        Boolean flag3 = MemcacheHelper.IsServersExists("Svr2", StuNo); ;
                        //如果2服务器中该学生数据也不存在
                        if (flag3 == false)
                        {
                            //查询服务2中的该表是否存在
                            Boolean flag4 = MemcacheHelper.IsServersExists("Svr2", "studententities");
                            if (flag4 == false)
                            {
                                //如果表也不存在,就从数据库中查所有学生信息放到memcached中
                                List<StudentViewModel> allstudentList = new List<StudentViewModel>();
                                allstudentList = StudentBll.QueryAllStudent();
                                //声明一个空List
                                List<StudentViewModel> bigStudentList = null;
                                foreach (var item in allstudentList)
                                {
                                    bigStudentList.Add(item);
                                }
                                //然后将这个大的list放到memcached中
                                MemcacheHelper.SetTo("Svr1", "studententities", bigStudentList);
                                MemcacheHelper.SetTo("Svr2", "studententities", bigStudentList);
                                //将每一个都放入到里面
                                for (int i = 0; i < allstudentList.Count(); i++)
                                {
                                    MemcacheHelper.SetTo("Svr1", allstudentList[i].StudentNo, allstudentList[i]);
                                    MemcacheHelper.SetTo("Svr2", allstudentList[i].StudentNo, allstudentList[i]);
                                }
                            }
                            else
                            {
                                //如果服务器2中表存在就从数据库中查询该信息放到memcached中
                                studentlist = StudentBll.QueryStuInfoByStuNo(StuNo);
                                string studentNo = studentlist.Count == 0 ? "null" : studentlist[0].StudentNo;
                                MemcacheHelper.SetTo("Svr2", studentNo, studentlist);
 
                            }
 
                            //再从缓存中取出该学号的数据
                            studentlist = (List<StudentViewModel>)MemcacheHelper.GetCounterFrom("Svr2", StuNo);                        
 
                        }
                        else
                        { //如果服务2中该学生信息存在
                            //则从服务器2中获得数据
                            studentlist = (List<StudentViewModel>)MemcacheHelper.GetCounterFrom("Svr2", StuNo);
                        }
 
                    }                                   
                     break;       
            }
 
            return studentlist;
 
        }
        #endregion

  整个代码的逻辑是:先从默认的memcached服务器上面查询该学生信息,如果存在则取出,不存在则判断该服务器上面该学生整张表是否存在,如果不存在可能表示该服务器已经宕机,需要从备份的memcached服务器中取信息。而从备份的memcached服务器中取信息也是这么一套流程,如果两个服务器中都不存在就从数据库服务器中取出该学生信息。

    为了缓解压力,我们还需要加入一个算法:单个学号来了去默认memcached服务器上面取,双号学号来了去备份的memcached服务器上面取信息!这样就减少了都从一台memcached服务器上面取数据的压力,使取数据更加的快!(其实跟这个算法很像的例子在我以前写 的博客中有,大家可以查看!这里就不贴代码了!)
 
    期待接下来的学习!


     
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 35
    评论
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值