class UserViewInfo
{
//用戶ID
public int UserId { get; set; }
//訪問時間,utc時間戳
public int Time { get; set; }
//用戶姓名
public string UserName { get; set; }
}
複製代碼
用戶空間添加訪問記錄的代碼
class UserSpace
{
//緩存的最大數量
const int CacheLimit = 1000;
//這裏用雙向鏈表來緩存用戶空間的訪問記錄
LinkedList<UserViewInfo> cacheUserViewInfo = new LinkedList<UserViewInfo>();
//這裏用哈希表的變種Dictionary來存儲訪問記錄,實現快速訪問,同時設置容量大於緩存的數量限制,減少哈希衝突
Dictionary<int, UserViewInfo> dicUserView = new Dictionary<int, UserViewInfo>(1250);
//添加用戶的訪問記錄
public void AddUserView(UserViewInfo uv)
{
//首先查找緩存列表中是否存在,利用hashtable來實現快速查找
if (dicUserView.TryGetValue(uv.UserId, out UserViewInfo currentUserView))
{
//若是存在,則把該用戶訪問記錄從緩存當前位置移除,添加到頭位置
cacheUserViewInfo.Remove(currentUserView);
cacheUserViewInfo.AddFirst(currentUserView);
}
else
{
//若是不存在,則添加到緩存頭部 並添加到哈希表中
cacheUserViewInfo.AddFirst(uv);
dicUserView.Add(uv.UserId, uv);
}
//這裏每次都判斷一下緩存是否超過限制
if (cacheUserViewInfo.Count > CacheLimit)
{
//移除緩存最後一個元素,並從hashtable中刪除,理論上來講,dictionary的內部會兩個指針指向首元素和尾元素,因此查找這兩個元素的時間複雜度爲O(1)
var lastItem = cacheUserViewInfo.Last.Value;
dicUserView.Remove(lastItem.UserId);
cacheUserViewInfo.RemoveLast();
}
}
}
複製代碼