public void AddViewsCount(int passageId, IPAddress ip) { try { Ensure.IsDatabaseId(passageId, nameof(passageId)); Ensure.NotNull(ip, nameof(ip)); string ipAddress = ip.ToString(); base.Log(message: "访问量统计:新增访问量缓存。", parameters: new { passageId, ipAddress }); LockViewsDictionary(dic => { base.Log(message: "访问量统计:已锁定访问量缓存列表。", parameters: new { ViewsDictionary = dic }); lock (WikiPassageService._addViewsLock) { if (!dic.ContainsKey(passageId)) { dic.Add(passageId, new Dictionary <string, ViewsCountDto>()); base.Log(message: "访问量统计:创建了访问量统计缓存项。", parameters: new { passageId = passageId, viewsDictionary = dic }); } if (dic[passageId].ContainsKey(ipAddress)) { DateTime lastUpdateTime = dic[passageId][ipAddress].LastUpdateTime; if (lastUpdateTime.AddMinutes(5) < DateTime.Now) { dic[passageId][ipAddress].NewViews += 1; dic[passageId][ipAddress].LastUpdateTime = DateTime.Now; base.Log(message: "访问量统计:缓存已包含当前文档的缓存项。更新了访问量统计缓存项。", parameters: new { passageId = passageId, viewsDictionary = dic }); } } else { ViewsCountDto viewsCountDto = new ViewsCountDto(); viewsCountDto.NewViews = 1; viewsCountDto.LastUpdateTime = DateTime.Now; dic[passageId].Add(ipAddress, viewsCountDto); base.Log(message: "访问量统计:缓存未包含当前文档的缓存项。创建了新的文章缓存项。", parameters: new { passageId = passageId, viewsDictionary = dic }); } } }); } catch (Exception ex) { base.Log(message: "访问量统计:新增访问量出现异常。", parameters: new { ex = ex.ToString(), passageId, ip = ip.ToString() }); } }
public async Task AddViewsCount(int passageId, IPAddress ip) { try { Ensure.IsDatabaseId(passageId, nameof(passageId)); Ensure.NotNull(ip, nameof(ip)); string ipAddress = ip.ToString(); LockViewsDictionary(dic => { if (!dic.ContainsKey(passageId)) { dic.Add(passageId, new Dictionary <string, ViewsCountDto>()); } if (dic[passageId].ContainsKey(ipAddress)) { DateTime lastUpdateTime = dic[passageId][ipAddress].LastUpdateTime; if (lastUpdateTime.AddMinutes(5) < DateTime.Now) { dic[passageId][ipAddress].NewViews += 1; dic[passageId][ipAddress].LastUpdateTime = DateTime.Now; } } else { ViewsCountDto viewsCountDto = new ViewsCountDto(); viewsCountDto.NewViews = 1; viewsCountDto.LastUpdateTime = DateTime.Now; dic[passageId].Add(ipAddress, viewsCountDto); } this._redisService.ObjectSetAsync(StringConsts.ViewsCountDictionary, dic).GetAwaiter(); }); } catch (Exception ex) { await base.Log(message : "访问量统计:新增访问量出现异常。", parameters : new { ex = ex.ToString(), passageId, ip = ip.ToString() }); } }