如果想自己做个文章的浏览量功能,应该用Job还是Observer?

我知道这是有相关套件包,但刚好这个项目需要准确一点点的记录浏览数量,并且获得一些数据并记录起来,比如浏览的时间、ip、user_id 等等

之前有研究过 cyrildewit/eloquent-viewable
发现他好像把数据单单存到redis 不存在SQL,对于SQL这套件只给浏览量+1? 而不能作其他计算?

自己做?

但如果我不用套件我知道如果每一次进入时都把IP写入SQL,然后每次进入都要检查一下IP是否24小时内没有浏览过同一篇文章,感觉这样是否很费SQL效能吧?
我应该直接就这样写入SQL?
posts_views
id (AUTO_INCREMENT)
posts_id
ip_address
timestamp

这样应该加一层job 或observer去记录吗? 还是说直接放在 POST::show 中就算了?

身为新手的我,也跑去了研究redis,也理解得很有限

最理想的做法是,有没有一个可能,是把一些浏览数据先存在redis或cache的中间层? 然后再定时的写入数据库?

还是说,其实大佬们已经有其他类似解决的方法?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

我做这个功能的时候没有使用 Job 和 Observer,我使用了中间件,这样做的好处是不会侵入业务代码。给每个文章建立了一个 Redis 的 hash 表,我也没有使用 ip 来记录访问次数,「因为一个局域网下,多个终端访问的时候,不会被统计浏览次数。」我的做法是当客户端第一次请求应用的时候,会颁发给客户端一个 view-tag,前端把它存储在 LocalStorage,前端每次请求时在 header 中添加 view-tag,这样就会分别统计每个客户端的浏览次数,但它也有一个弊端,当前端缓存被清除时,view-tag 会发生变化,可能会发生刷浏览量的行为,具体看你那边的业务需求,如果不想这种情况发生,那就需要强制用户登录,然后在 hash 表中记录 user_id 即可。

在中间件中要做的操作就是判断 header 中是否有 tag 标签,如果有的话,去检查这个文章的 hash 表中是否有这个 view-tag ,如果没有,把 view-tag 和 用户 id (如果有,没有的话记录 IP 地址),写入 hash 表,下一次相同 view-tag 的用户再次访问这篇文章时,就不会再增加次数。

然后再使用任务调度,每几小时,或每天把 Redis 数据持久化。这样相同 view-tag 用户可以每个周期结束后再次访问这篇文章时,浏览次数还会再 +1。

2年前 评论
SS (楼主) 2年前
MArtian (作者) 2年前
SS (楼主) 2年前
讨论数量: 11

可以看一下页面访问统计工具 laravel-visits,我的博客文章浏览量就是用的这个 页面访问统计工具 laravel-visits:021. 统计页面访问次数——awssat/laravel...

2年前 评论
SS (楼主) 2年前

我做这个功能的时候没有使用 Job 和 Observer,我使用了中间件,这样做的好处是不会侵入业务代码。给每个文章建立了一个 Redis 的 hash 表,我也没有使用 ip 来记录访问次数,「因为一个局域网下,多个终端访问的时候,不会被统计浏览次数。」我的做法是当客户端第一次请求应用的时候,会颁发给客户端一个 view-tag,前端把它存储在 LocalStorage,前端每次请求时在 header 中添加 view-tag,这样就会分别统计每个客户端的浏览次数,但它也有一个弊端,当前端缓存被清除时,view-tag 会发生变化,可能会发生刷浏览量的行为,具体看你那边的业务需求,如果不想这种情况发生,那就需要强制用户登录,然后在 hash 表中记录 user_id 即可。

在中间件中要做的操作就是判断 header 中是否有 tag 标签,如果有的话,去检查这个文章的 hash 表中是否有这个 view-tag ,如果没有,把 view-tag 和 用户 id (如果有,没有的话记录 IP 地址),写入 hash 表,下一次相同 view-tag 的用户再次访问这篇文章时,就不会再增加次数。

然后再使用任务调度,每几小时,或每天把 Redis 数据持久化。这样相同 view-tag 用户可以每个周期结束后再次访问这篇文章时,浏览次数还会再 +1。

2年前 评论
SS (楼主) 2年前
MArtian (作者) 2年前
SS (楼主) 2年前
GDDD

这样简单的功能,你说的两个方法都可以,但是如果用户量很大,从优化角度肯定是job任务队列去实现好多了。

2年前 评论
SS (楼主) 2年前
GDDD (作者) 2年前

matomo 用js去请求的统计。

2年前 评论
SS (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!