程序开发 > C# > 正文

Hashtable 缓存在线人数(实例)

亮术网 2020-09-01 本网原创

网站常常要缓存在线人数,用 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;
    }
  }