惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
美团技术团队
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
F
Fortinet All Blogs
A
About on SuperTechFans
Recent Announcements
Recent Announcements
D
Docker
Vercel News
Vercel News
Engineering at Meta
Engineering at Meta
腾讯CDC
Martin Fowler
Martin Fowler
阮一峰的网络日志
阮一峰的网络日志

博客园 - 火冰·瓶

Cloudflare Tunnel 有两种模式 用 Cloudflare Tunnel 实现从外网 SSH 登录内网服务器 Cloudflare + .NET Core MVC 部署完整流程 net core 后端获取网络图片的扩展名 推荐好用的web控件 ubuntu运维 使用Frp+Caddy把https映射到内网的web服务 net core中结合EntityFrameworkCore的DB first使用PostgreSQL OneDrive中设置不同步某个文件夹 Framework 4.7老项目运行到caddy Action<T> 和 Func<T>的用法 EF Core经验 net core随记 asp.net core 记录页面访问次数,同一个IP一个小时只算一次 asp.net core 记录页面访问记录 asp.net core 发布到caddy asp.net core发布到Caddy获取用户的真实ip 使用on()方法绑定事件,解决动态加载的元素事件绑定 鼠标悬停在图片上方时,显示文字
统计文章阅读量,一小时内重复刷新的不重复统计
火冰·瓶 · 2025-03-30 · via 博客园 - 火冰·瓶

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. 持久化数据:阅读量最终保存到数据库中,确保统计结果准确。