两个类:UserInfoClass.cs和checkLogin.cs
第一个类是用来处理用户数据的,可以记录用户编号、名称、短消息数等等,第二个类是用来检验用户有没有登录同时检查要不要更新缓存的
这个是UserInfoClass.cs
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/// <summary>
/// UserInfoClass 的摘要说明
/// </summary>
public class UserInfoClass
{
public static string NeedReLoadList="";
private int uid;
public int Get_uid
{
get
{
return uid;
}
}
private string truename;
public string Get_truename
{
get
{
return truename;
}
}
private int smsCount;
public int Get_smsCount
{
get
{
return smsCount;
}
}
public UserInfoClass()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public void ReLoadInfoCache(string str_uid)
{
//记录用户编号、名称、待查看短消息数目
//获取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings["NNLLTestConnectionString"].ConnectionString;
//创建并设置SqlConnection
SqlConnection dbConnection = new SqlConnection(connectionString);
//定义SQL查询语句
string queryString;
queryString="select uid,truename,SmsCount from T_User where uid=@uid";
//创建并设置SqlCommand
SqlCommand dbCommand = new SqlCommand();
dbCommand.Connection = dbConnection;
dbCommand.CommandType = CommandType.Text;
dbCommand.CommandText = queryString;
//设置查询参数@una
SqlParameter p_uid = new SqlParameter();
p_uid.ParameterName = "@uid";
p_uid.Value = str_uid;
p_uid.DbType = DbType.Int32;
dbCommand.Parameters.Add(p_uid);
//创建SqlDataAdapter,并获取数据
SqlDataAdapter dataAdapter = new SqlDataAdapter(dbCommand);
DataSet ds = new DataSet();
dataAdapter.Fill(ds);
//取结果集的行数
int row = 0;
row = ds.Tables[0].Rows.Count;
if (row > 0)
{
//uid,truename,SmsCount
uid = Convert.ToInt32(ds.Tables[0].Rows[0][0]);
truename = ds.Tables[0].Rows[0][1].ToString();
smsCount = Convert.ToInt32(ds.Tables[0].Rows[0][2]);
}
//关闭数据
if (dbConnection.State == ConnectionState.Open)
{
dbConnection.Close();
}
}
public static void SetReLoadList(string uid, bool isAdd)
{
//修改NeedReLoadList的值
if (isAdd)
{
//在NeedReLoadList上添加uid
uid = "," + uid + ",";
if (NeedReLoadList.IndexOf(uid) == -1)
{
NeedReLoadList = NeedReLoadList + uid;
}
}
else
{
NeedReLoadList.Replace(uid, ",");
}
}
}
有一个public static的类变量NeedReLoadList,用来记录需要更新缓存的用户编号,用的格式是这样的:,1,2,3,4,5,
有三个private的只读类变量uid、truename、smsCount用来记录用户编号、名称、短消息数,要读取他们可以使用Get_uid()、Get_truename()、Get_smsCount()三个公有的方法
有两个public的方法ReLoadInfoCache()和SetReLoadList()
SetReLoadList()是用来更新NeedReLoadList的,有两个参数,uid和isAdd,如果isAdd==true,就是要把uid加入NeedReLoadList里,设置uid需要更新缓存,如果isAdd=false,就是把uid从NeedReLoadList里删除,当uid再刷新页面的时候,它不用重新读取数据库更新缓存
ReLoadInfoCache()方法是用来读取数据库里的信息更新用户缓存的,在用户登录的时候,我也执行这个方法,用来把数据库里的信息读取到用户缓存里
然后是checkLogin.cs
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/// <summary>
/// checkLogin 的摘要说明
/// </summary>
public class checkLogin
{
public checkLogin()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public static void check(Page aPage, bool needAdmin)
{
//判断是否有登录
if (aPage.Session["uid"] == null || aPage.Session["uic"] == null)
{
aPage.Response.Redirect("../Default.aspx");
aPage.Response.End();
}
//判断是否要更新缓存
string uid,ustr;
uid=aPage.Session["uid"].ToString();
ustr = "," + uid + ",";
if (UserInfoClass.NeedReLoadList.IndexOf(ustr) != -1 )
{
//aPage.Response.Write("<br>准备更新:" + uid);
//更新缓存
UserInfoClass myuic = new UserInfoClass();
myuic.ReLoadInfoCache(uid);
//重新记录session值
aPage.Session["uic"] = myuic;
//从更新名单中删除
UserInfoClass.SetReLoadList(uid,false);
}
}
}
因为uid是经常使用的变量,所以我把他另外保存了一个Session,所以在判断登录的时候我判断了两个Session值
Session["uic"]里保存的就是UserInfoClass里取到的值了
每个用户在登录成功时都会执行这一段的
所以每个用户在运行过程里都会有一个Session["uic"],里面记录了他所有需要记录到缓存的信息
我在系统的母版里设置有
所以用户每进一个页面都需要执行一次check()方法
如果有有用户1给用户2发送了短消息,只需要执行
就可以把用户2加入刷新缓存的列表里了,如果用户2在线,当他刷新任何一个页面时,check()方法会强迫他刷新自己的缓存,如果用户2不在线,当他登录时,他会读取自己的缓存,然后把自己从刷新缓存的列表里删除
我测试这个,是因为我想知道在asp.net里,像短消息的提醒、事件的提醒这些东西要怎么做
如果每次刷新页面都读取数据库,这肯定是不可能的,很多时候缓存没有改变,我们不需要读取数据库,所以我就想办法避开读取数据库,用这个方法,可以做到只在有需要的时候读取数据库
就是我还在想,这个方法如果在有很多人使用的情况下,占用资源会有多少?我为每个用户都开了一个UserInfoClass类对象,还用Session记录他,如果有一千个人同时登录,资源占用是多少呢?
还有就是如果我是想写一个论坛,发一个帖子,就会有积分的改变,这些积分的东西,要记录在缓存里吗?动网的类里记录了很多很多东西,他是怎么刷新的?如果我把这个积分也记录在缓存里,那我发完帖子时,是直接在缓存里加积分吗?就是每次发帖子,用存储过程或触发器给用户表的积分字段+10,然后呢,这样来:
是这样吗?这样可以避免读取数据库
就是最主要的是不知道这样的方法占用资源是多少,我不懂测试这个