1. 添加服务
在 Startup.cs 或 Program.cs 中注册缓存服务,例如使用内存缓存:
builder.Services.AddMemoryCache();
2. 控制器逻辑
在控制器中实现阅读量统计逻辑:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using System;
namespace ArticleReadCount.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ArticleController : ControllerBase
{
private readonly IMemoryCache _cache;
public ArticleController(IMemoryCache cache)
{
_cache = cache;
}
[HttpGet("{articleId}")]
public IActionResult ReadArticle(int articleId)
{
var clientIp = HttpContext.Connection.RemoteIpAddress?.ToString(); // 获取用户 IP
var cacheKey = $"ArticleRead_{articleId}_{clientIp}";
// 检查缓存是否已有记录
if (!_cache.TryGetValue(cacheKey, out _))
{
// 如果没有记录,则增加阅读量
IncrementArticleReadCount(articleId);
// 设置缓存,有效期为1小时
_cache.Set(cacheKey, true, TimeSpan.FromHours(1));
}
return Ok($"Article {articleId} viewed.");
}
private void IncrementArticleReadCount(int articleId)
{
// 此处可以保存阅读量至数据库,示例中简单输出
Console.WriteLine($"Article {articleId} read count incremented!");
}
}
}
3. 数据存储
IncrementArticleReadCount 方法可以保存阅读量到数据库,例如使用 EF Core 更新文章阅读量:
private void IncrementArticleReadCount(int articleId)
{
using (var context = new AppDbContext())
{
var article = context.Articles.FirstOrDefault(a => a.Id == articleId);
if (article != null)
{
article.ReadCount++;
context.SaveChanges();
}
}
}
4. 测试功能
启动 API 后,可以通过访问类似以下的 URL 来触发阅读量统计:
GET http://localhost:5000/api/article/1
代码解释
-
缓存防重复:通过用户的 IP 和文章 ID 生成唯一缓存键,记录访问状态。一小时内如果同一用户再次访问,缓存会阻止重复计数。
-
灵活性:可以将缓存实现替换为 Redis 等分布式缓存,以支持多服务器环境。
-
持久化数据:阅读量最终保存到数据库中,确保统计结果准确。
浙公网安备 33010602011771号