由于评教急需基础的接口,而基础短时间没有人写接口,所以我就暂时的去基础写评教的接口!也是因为这样,我又机会用到了自己研究了很久的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服务器上面取数据的压力,使取数据更加的快!(其实跟这个算法很像的例子在我以前写 的博客中有,大家可以查看!这里就不贴代码了!)
期待接下来的学习!