您所在的位置: 程序员家园 -> 家园博客 ->
 
在哪里摔倒
就在哪里自己爬起来

用户登录

查  找

最新评论

最新留言

常用网站

网易邮箱 GMAIL  

百度搜索 MSDN

霏凡软件 BT精品

影视帝国 射 手 网

电驴下载 全 库 网

友情连接

茄菲的窝 冰冰博客

枫叶飘零 玫  瑰

ACEN 云 豹 子

统  计



一种只在有需要的时候才刷新数据的方法,就是不知道占用的资源有多少 
狼子 发表于 2007-1-31 17:44:00 阅读全文 | 回复(0) | 引用通告 | 编辑  asp.net查看本站使用过本标签的日志查看本站使用过本标签的用户

两个类: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里取到的值了

每个用户在登录成功时都会执行这一段的

//记录用户编号、名称、待查看短消息数目
        UserInfoClass myuic = new UserInfoClass();
        myuic.ReLoadInfoCache(uid);
        Session["uic"] = myuic;
        //刚刚刷新缓存的,把名单删除
        UserInfoClass.SetReLoadList(uid,false);
        //记录别的Session值
        Session["uid"] = uid;

所以每个用户在运行过程里都会有一个Session["uic"],里面记录了他所有需要记录到缓存的信息

我在系统的母版里设置有

protected void Page_Init(object sender, EventArgs e)
    {
        checkLogin.check(this.Page, true);
    }

所以用户每进一个页面都需要执行一次check()方法

如果有有用户1给用户2发送了短消息,只需要执行

UserInfoClass uic = new UserInfoClass();
            UserInfoClass.SetReLoadList("2", true);

就可以把用户2加入刷新缓存的列表里了,如果用户2在线,当他刷新任何一个页面时,check()方法会强迫他刷新自己的缓存,如果用户2不在线,当他登录时,他会读取自己的缓存,然后把自己从刷新缓存的列表里删除

我测试这个,是因为我想知道在asp.net里,像短消息的提醒、事件的提醒这些东西要怎么做

如果每次刷新页面都读取数据库,这肯定是不可能的,很多时候缓存没有改变,我们不需要读取数据库,所以我就想办法避开读取数据库,用这个方法,可以做到只在有需要的时候读取数据库

就是我还在想,这个方法如果在有很多人使用的情况下,占用资源会有多少?我为每个用户都开了一个UserInfoClass类对象,还用Session记录他,如果有一千个人同时登录,资源占用是多少呢?

还有就是如果我是想写一个论坛,发一个帖子,就会有积分的改变,这些积分的东西,要记录在缓存里吗?动网的类里记录了很多很多东西,他是怎么刷新的?如果我把这个积分也记录在缓存里,那我发完帖子时,是直接在缓存里加积分吗?就是每次发帖子,用存储过程或触发器给用户表的积分字段+10,然后呢,这样来:

UserInfoClass myuic = new UserInfoClass();
myuic = Session["uic"];
myuic.Get_积分=myuic.Get_积分+10;  //这里的Get_积分()方法是可读写的方法
Session["uic"] = myuic;

是这样吗?这样可以避免读取数据库

就是最主要的是不知道这样的方法占用资源是多少,我不懂测试这个

发表评论:

    昵称:
    密码:
    主页:
    标题:
Powered by Oblog.