博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

统计文章阅读量,一小时内重复刷新的不重复统计

Posted on 2025-03-30 18:19  火冰·瓶  阅读(43)  评论(0)    收藏  举报

1. 添加服务

Startup.csProgram.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

 

代码解释

  1. 缓存防重复:通过用户的 IP 和文章 ID 生成唯一缓存键,记录访问状态。一小时内如果同一用户再次访问,缓存会阻止重复计数。

  2. 灵活性:可以将缓存实现替换为 Redis 等分布式缓存,以支持多服务器环境。

  3. 持久化数据:阅读量最终保存到数据库中,确保统计结果准确。