如果想自己做个文章的浏览量功能,应该用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的中间层? 然后再定时的写入数据库?
还是说,其实大佬们已经有其他类似解决的方法?
我做这个功能的时候没有使用 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。