首页 > 其他分享 >博客系统中实现文章浏览量

博客系统中实现文章浏览量

时间:2024-05-15 15:43:02浏览次数:20  
标签:浏览量 views show Redis 博客 文章 post id

在博客系统中实现文章浏览量(或阅读次数)功能,有几种不同的方法。以下是几种常见的方法及其优缺点:

方法一:数据库字段计数

为文章表添加一个字段用于存储浏览量,每次文章被访问时,更新该字段。

实现步骤

  1. 添加字段
    在文章表(例如 posts 表)中添加一个 views 字段:

    Schema::table('posts', function (Blueprint $table) {
        $table->unsignedBigInteger('views')->default(0);
    });
    
  2. 更新浏览量
    在文章控制器的 show 方法中增加浏览量计数逻辑:

    class PostController extends Controller
    {
        public function show($id)
        {
            $post = Post::findOrFail($id);
    
            // 增加浏览量
            $post->increment('views');
    
            return view('posts.show', compact('post'));
        }
    }
    

优缺点

  • 优点

    • 实现简单、直接。
    • 适用于浏览量较少的情况。
  • 缺点

    • 高并发情况下频繁的数据库写操作会影响性能。
    • 数据库负载增加。

方法二:使用Redis缓存计数

将浏览量数据缓存到 Redis 中,并定期将数据同步到数据库。这种方法能有效减少数据库写操作,提高性能。

实现步骤

  1. 安装 Redis
    确保你已经安装并配置了 Redis。

  2. 更新浏览量
    在文章控制器的 show 方法中增加浏览量计数逻辑:

    class PostController extends Controller
    {
        public function show($id)
        {
            $post = Post::findOrFail($id);
    
            // 增加浏览量到 Redis
            Redis::incr("post:{$post->id}:views");
    
            return view('posts.show', compact('post'));
        }
    }
    
  3. 同步数据
    创建一个 Artisan 命令,将 Redis 中的浏览量同步到数据库,可以通过定时任务(如 Laravel 的调度器)执行该命令。

    class SyncPostViews extends Command
    {
        protected $signature = 'sync:post-views';
        protected $description = 'Sync post views from Redis to database';
    
        public function handle()
        {
            $posts = Post::all();
    
            foreach ($posts as $post) {
                $views = Redis::get("post:{$post->id}:views");
    
                if ($views) {
                    $post->views = $views;
                    $post->save();
                }
            }
    
            $this->info('Post views synced successfully.');
        }
    }
    

优缺点

  • 优点

    • 适用于高并发情况。
    • 减少数据库写操作,提高性能。
  • 缺点

    • 实现稍复杂。
    • 需要定期同步数据。

方法三:记录用户访问日志分析

将每次访问记录到日志或单独的表中,通过定时任务分析日志或表中的数据并更新浏览量。这种方法适用于需要精确分析用户行为的情况。

实现步骤

  1. 创建访问日志表

    Schema::create('post_views', function (Blueprint $table) {
        $table->id();
        $table->unsignedBigInteger('post_id');
        $table->ipAddress('ip_address');
        $table->timestamps();
    });
    
  2. 记录访问日志
    在文章控制器的 show 方法中记录访问日志:

    class PostController extends Controller
    {
        public function show($id)
        {
            $post = Post::findOrFail($id);
    
            // 记录访问日志
            PostView::create([
                'post_id' => $post->id,
                'ip_address' => request()->ip(),
            ]);
    
            return view('posts.show', compact('post'));
        }
    }
    
  3. 分析日志
    创建一个 Artisan 命令分析访问日志并更新浏览量,可以通过定时任务执行该命令:

    class UpdatePostViews extends Command
    {
        protected $signature = 'update:post-views';
        protected $description = 'Update post views based on logs';
    
        public function handle()
        {
            $posts = Post::all();
    
            foreach ($posts as $post) {
                $views = PostView::where('post_id', $post->id)->count();
    
                $post->views = $views;
                $post->save();
            }
    
            $this->info('Post views updated successfully.');
        }
    }
    

优缺点

  • 优点

    • 可以记录详细的用户访问日志,便于分析用户行为。
    • 可以过滤重复访问,计算独立访客数。
  • 缺点

    • 实现较为复杂。
    • 数据量大时,性能可能会受到影响。

推荐方法

对于一般的博客系统,推荐使用 方法二:使用 Redis 缓存计数。该方法平衡了实现复杂度和性能需求,能够在高并发情况下有效减少数据库压力,同时保证数据同步的及时性和准确性。

总结来说,方法二通过 Redis 缓存来处理高并发的浏览量记录,定期同步到数据库,适用于大多数场景。方法一适用于简单的博客系统或并发量较小的场景,而方法三适用于需要精细化数据分析的场景。选择哪种方法应根据具体需求和系统负载来决定。

标签:浏览量,views,show,Redis,博客,文章,post,id
From: https://www.cnblogs.com/laraveler/p/18193994

相关文章

  • 一键自动化博客发布工具,用过的人都说好(51cto篇)
    51cto是一个优秀的博客平台,今天给大家讲解一下blog-auto-publishing-tools如何自动发布博客到51cto上。当然在实现过程中有可能会遇到各种困难,不过不用担心,我们一个个来解决。前提条件前提条件当然是先下载blog-auto-publishing-tools这个博客自动发布工具,地址如下:https://gi......
  • 最近几个SQL优化案例(水一波博客,当段子看)
    某国产数据库原厂高级工程师找我优化SQL,以下是他给的三个案例。......
  • 贡献值最低博客
    在过去一段时间的工作中,我不得不反思自己的表现。我意识到,由于自身实力不够,我未能充分承担团队任务,导致我的任务分配相对较少,团队贡献值也较低。这一点让我感到深深的遗憾和内疚。首先,我意识到在团队中,每个人的贡献都至关重要。我的工作表现不仅仅影响着自己的发展,也影响着整个团......
  • 第 7 篇 Scrum 冲刺博客
    这个作业属于哪个课程软件工程2024这个作业要求在哪里团队作业4——项目冲刺这个作业的目标记录敏捷流程下第七天的项目开发进展,对团队昨日的项目进度进行总结一、每日站立式会议1、每日站立式会议照片2、会议摘要本次会议为第七次ScrumMeeting会议~由于......
  • 第 6 篇 Scrum 冲刺博客
    这个作业属于哪个课程软件工程2024这个作业要求在哪里团队作业4——项目冲刺这个作业的目标记录敏捷流程下第六天的项目开发进展,对团队昨日的项目进度进行总结一、每日站立式会议1、每日站立式会议照片2、会议摘要本次会议为第六次ScrumMeeting会议~由于......
  • 第 5 篇 Scrum 冲刺博客
    这个作业属于哪个课程软件工程2024这个作业要求在哪里团队作业4——项目冲刺这个作业的目标记录敏捷流程下第五天的项目开发进展,对团队昨日的项目进度进行总结一、每日站立式会议1、每日站立式会议照片2、会议摘要本次会议为第五次ScrumMeeting会议~由于......
  • C#应用的欢迎界面窗体方案 - 开源研究系列文章
          这次整理以前的代码,然后想到了应用的欢迎界面窗体的问题。这个例子是在应用中启动一个线程来进行显示欢迎窗体的,对于应用的启动无影响,与其他人的源码不相同,欢迎读者进行复用此类库。      以前有编写过欢迎界面窗体的代码,不过这次翻出来的时候想把它完善一下......
  • 第 4篇 Scrum 冲刺博客
    这个作业属于哪个课程软件工程2024这个作业要求在哪里团队作业4——项目冲刺这个作业的目标记录敏捷流程下第四天的项目开发进展,对团队昨日的项目进度进行总结一、每日站立式会议1、每日站立式会议照片2、会议摘要本次会议为第四次ScrumMeeting会议~由于......
  • 第 3篇 Scrum 冲刺博客
    这个作业属于哪个课程软件工程2024这个作业要求在哪里团队作业4——项目冲刺这个作业的目标记录敏捷流程下第三天的项目开发进展,对团队昨日的全员学习进度进行总结一、每日站立式会议1、每日站立式会议照片2、会议摘要本次会议为第三次ScrumMeeting会议~......
  • 第 2篇 Scrum 冲刺博客
    这个作业属于哪个课程软件工程2024这个作业要求在哪里团队作业4——项目冲刺这个作业的目标记录敏捷流程下第二天的项目开发进展,对团队昨天的工作进行总结一、每日站立式会议1、每日站立式会议照片2、会议摘要本次会议为第二次ScrumMeeting会议~由于本次......