Hashtable 缓存在线人数(实例)
网站常常要缓存在线人数,用 Hashtable 就是一个不错的选择,毕竟存取十分方便快速,下线的会员可以随时删除减少服务器的压力。
必须定义一个静态的 Hashtable,不然无法缓存;Hashtable.Synchronized 表示 Hashtable 在进程间同步,以免出错。该类基本实现了要用到的方法,只需调用就可以了。
Hashtable 缓存在线人数实例:
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Web;
public class OnLineUser
{
private static Hashtable ht = Hashtable.Synchronized(new Hashtable());
/// <summary>
/// 向 Hashtable 中添加会员
/// <summary>
/// <param name="userId">会员ID</param>
public static void AddUser(string userId)
{
if(!ht.Contains(userId))
ht[userId] = DateTime.Now;
}
/// <summary>
/// 检查会员是否在线
/// <summary>
/// <param name="userId">会员ID</param>
/// <param name="t">超过几分钟不请求视为下线</param>
/// <returns>true:在线;false:不在线</returns>
public static bool IsOnLineUser(string userId, int t)
{
if(ht.Contains(userId))
{
DateTime dt = (DateTime)ht[userId];
if(GetMinutes(DateTime.Now, dt) > t)
return true;
else
return false;
}
else
return false;
}
/// <summary>
/// 显示所有在线会员
/// <summary>
/// <returns>所有在线会员</returns>
public static string ShowOnLineUser()
{
if(ht.Count > 0)
{
StringBuilder sb = new StringBuilder();
foreach(DictionaryEntry de in ht)
sb += de.Value.ToSting();
}
return sb.ToSting();
}
/// <summary>
/// 取两个时间间隔(分)
/// </summary>
/// <param name="newTime">新时间</param>
/// <param name="oldTime">旧时间</param>
/// <returns>两个时间间隔</returns>
public static int GetMinutes(DateTime dt1, DateTime dt2)
{
TimeSpan ts1 = new TimeSpan(dt1.Ticks);
TimeSpan ts2 = new TimeSpan(dt2.Ticks);
TimeSpan ts = ts1.Subtract(ts2).Duration();
return (int)ts.TotalMinutes;
}
}