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();
}
}
}
複製程式碼