关于 Laravel-china 阅读数的问题

首先声明,我没有看过本站的源码,只是在使用过程中发现的一个小问题,所以发帖询问一下。

file

每个帖子的 title 的下面都有上图所示的一个基本信息,其中最后一个阅读 660,表示的是这个帖子被阅读过的数量,那么到底该如何定义阅读过这个词呢,我想每个人都有自己的看法,就是不知道有没有一个统一的规范认知了。

本站是怎么处理的呢,我发现我自己的帖子(别人的帖子也一样),只要我刷新一下,这个数量就会 +1,个人感觉这样处理是不太妥的。

Ruby-China 中只有点击数(hit)的记录,经我测试,不论是我自己的帖子还是别人的帖子,我反复点击 hit 数量都是没有增加的。

Github 也有相关的阅读过的概念,下图是我维护的一个仓库的数据,他有记录访客和独立访客(我自己翻译的,不对请拍砖)

file

可以看到,有从本站进去的访客记录,当我再一次从本站相关的页面链接 跳转到相应仓库中,然后刷新之前的 Github Traffic 页面,发现两个数量都是没有变化的。

根据这个,我觉得本站的阅读数的概念应该类似 Github 中的访客的概念为稳妥。但具体是怎么实现的,或者怎么定义的,我觉得有必要重新设计一下。

不过,如果本站的最初开发者就是这么想得或者这么设计的,就那就当我没说,尊重原作者的意见也是很重要的。

写的不好,欢迎吐嘈拍砖

本帖已被设为精华帖!
本帖由 Summer 于 7年前 加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 40
Summer

这个字段叫:view_count ,意为查看次数的意思。

举个例子,假如你很喜欢 【肖申克的救赎】这部片,你看了 5 遍。 我问你:这部电影你看了多少次了?你应该怎么回答?1 次呢,还是 5 次呢?

产品的东西还真是蛮有趣的 :smile: ,是吧。

关于说一开始的设计构思这个问题,压根就没想,完全是怎么快怎么来,觉得要加个 view_count ,行,那就创建一个字段,然后查看的时候加一即可。

他们都加了缓存,你可以打开 ruby china 页面,然后刷新 20 下试试。

7年前 评论
Summer

Github 的话你也可以打开多个浏览器刷刷刷,你会发现都没有增长。

一般像 Github 这种访问量,并且在业务逻辑上 查看数 这个值并没有太多意义的,都会加缓存。尤其是在你查看的那个页面,那是统计,估计缓存更久,统计服务如 GA 的,承诺的是 24 内更新。

7年前 评论
Summer

统计服务如 GA(Google Analytics) 的,承诺的是 24 小时内更新。

7年前 评论
Summer

这个问题记得之前小文(@JobsLong )也提过一次

7年前 评论

@Summer 卧槽,刷新 20 次之后,还是一样的 hit 数,然后我打开 incognito widow 打开 hit 数就变了

7年前 评论
Summer

我再 @ @JobsLong

7年前 评论

@Summer 好吧,首先我觉得不是 Rails 或者 Laravel 的关系,毕竟 Laravel 也有借鉴 Rails 这应该是一个产品层面的东西,也不能说谁对谁错,仅仅是我个人觉得不妥而已。

你的意思是 Ruby-China 和 Github 其实本质上也是刷新一次就记录一次,只不过没有立即显示出来,而本站是立即显示出来了,经过我的验证 Ruby-China 确实是这样子。

我记得之前拜读某大牛的文章的时候他说

file

原文链接 如果其他网站也是这么做的,那么简单地说就是 view 是从缓存中读取的,按照数量或者时间来触发同步。

就是觉得,每刷新一次就增加一个 view 有点不适应,就是不知道对于这个概念有没有什么最佳实践或者行业通用做法。

我个人觉得这个阅读数的概念应该是若我是作者再怎么点击什么的,阅读数都不会增加,若我是一个注册用户(按照 session 区分)或者吃瓜群众(按照 ip 区分),那么一天内(或固定时间内)多次的阅读或点击都算一次。

7年前 评论

@Summer

举个例子,假如你很喜欢 【肖申克的救赎】这部片,你看了 5 遍。 我问你:这部电影你看了多少次了?你应该怎么回答?1 次呢,还是 5 次呢?

看电影这个例子举的很好,问题在于如果我打开电影,看了一分钟关了,又打开一次又关了,那我算看过还是没看过呢,按照现在的逻辑是我看了两遍,可是我觉得我没看啊,这应该就是我纠结的地方。

7年前 评论
Summer

大牛不大牛不知道,laravel china 的使用上,还没到需要去优化这个 count 的时候,提前去优化的话,完全就是过度优化。我至少能想到一百个地方比这个更加值得去优化的。

需要优化的话也蛮简单,就是那种流量超级大的时候,丢到内存缓存里,指定一个计划任务,过一段时间同步一次到数据库里。

其实需要讨论的,更多是产品层面上的东西。对了,刚刚问你的问题,假如你很喜欢 【肖申克的救赎】这部片,你看了 5 遍。 我问你:这部电影你看了多少次了?请问你会怎么回答?为什么?

7年前 评论
Summer

按照 ip 区分 这个,一般不能用来区分独立访问用户,很多公司或者小区出口 ip 只有一个,员工和小区人口。。。

7年前 评论
Summer

GA 统计的做法是区分每一个浏览器

7年前 评论
Summer

@helperhaps 在我看来,觉得完全没必要去纠结这些东西,完全是钻牛角尖了,跳出来想想,真的有那么重要吗?我问你看了多少次,你跟我说,第一次我看了 1 分钟,第二遍我看了两分钟,第三次我。。。。

7年前 评论

@Summer

laravel china 的使用上,还没到需要去优化这个 count 的时候,提前去优化的话,完全就是过度优化

同意。那也就是使用 session 确定注册用户使用浏览器确定群众,我只是说一下我的理解哈。(这条貌似扯远了)

那就不纠结了,(这也加精啊)

7年前 评论
Summer

有时候有一个参考会更好些,GA 的:

file

GA 对 PV 的定义是:

A pageview is defined as a view of a page on your site that is being tracked by the Analytics tracking code. If a user clicks reload after reaching the page, this is counted as an additional pageview. If a user navigates to a different page and then returns to the original page, a second pageview is recorded as well.

在这里,其实 view_count 和 Google Analytics 的 Page View 是一样的。

7年前 评论
Summer

@helperhaps 蛮有意思的话题,之前好几个人问过我,有人甚至提过 issue。加精让更多人看见,一起加入讨论

7年前 评论

@Summer OK,其实我们两个都说到了,这个是一个产品层面的东西(我7楼 你9楼), reload 一次就 +1 处理简单粗暴,我也不知道我在纠结什么,阅读数量增加太快,感觉数据太假,之类的吧,如果帖子排序算法中有阅读量这个维度的话,就可以刷热度(是我想太多)

7年前 评论

这里我引申一个另外的问题,这个 view_count 字段每次浏览文章就自增 +1 然后更新到数据库,假如同时访问的人很多很多,这样是不是效率很低,如何改进?

7年前 评论

@纸牌屋弗兰克 这个的话,你可以看一下我 7 楼的贴的图片或链接,如果你觉得效率低的话,(过早优化可是大忌啊)

7年前 评论
Summer

社区一般都这样,潜水用户挺多,刚刚在 GA 后台截的屏,相信我这个值不算高的

file

7年前 评论

@Summer 53 是登录用户吧,非登录用户应该更多吧

7年前 评论

这个方法思路挺好,view_count 不用每次浏览页面更新到数据库,而是通过缓存自增,定期从缓存写到数据库。

7年前 评论

@纸牌屋弗兰克 恩纳,不过还是得看具体场景情况而决定是否引入缓存,这系统复杂度就上去了

7年前 评论

这样的讨论,也蛮有意思的。

/Users/xiaop/Pictures/照片 Library.photoslibrary/Thumbnails/2016/07/10/20160710-114722/inbqoS6HTFapK32G8gl5lw/thumb_IMG_1712_1024.jpg

7年前 评论

@xiaop 哈哈,来互相伤害啊,那个图片还没有上传上来? :smile:

7年前 评论
Summer

@helperhaps
@xiaop Shit,完全猜不出来他要发什么图片。

file

7年前 评论

@Summer 我看他之前的帖子就说上传不了图片 :ghost:

7年前 评论

@Summer
@helperhaps
e,是这样的,我从“照片”里复制-粘贴,没有粘贴成功,直接复制粘贴照片文件也无法成功。

本来准备粘贴这个照片,我在西藏拍的罕见的7瓣格桑,据说看到的人会很幸福,

7年前 评论
Summer

@xiaop 拖进来

7年前 评论
Summer

@xiaop 让我们一起幸福 :metal:

7年前 评论

@xiaop 哈哈,反正我是拖拽上传

:loudspeaker: 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif

拉进来一起幸福

7年前 评论
lijinma

上传图片这个的问题我上次遇见了.

重现:只要上传不是 jpg,png,gif 的图片,就会卡住不动了,其实这个时候已经返回了错误,只是前端没有展示这个错误信心。

@Summer summer 兄改一改,哈哈哈

7年前 评论
Summer

@lijinma 已记录 :smile_cat:

7年前 评论

这个确实只是产品层次的逻辑要求而已.
我通常的做法:

  1. cookies标记topic_id 重复看帖 不计数
  2. show时, 遇到无标记则累加cache, 该cache失效期半个月, 一个月
  3. show时, 遇到cache累计数达到100,200 某个值时 更新view_counts
  4. show时, 阅读数为 DB view_counts + CACHE value
7年前 评论

@说好的呢 :+1:

1 和 2 我没看太懂,既然 cookies 标记 topic_id ,但为啥 show 时, 遇到无标记则累加 cache?你的所谓的 cache 指的是什么? redis?

是不是说 cookies 在客户端标记每个浏览器所看过的 topic,这样在特定时间内(cookies 过期前)就不会阅读很多次。cache 在服务端标记所有浏览器的,在特定时间内针对一个 topic 每个浏览器只有一次阅读数

7年前 评论

@helperhaps

cookies在这里的作用只是简单的防止 多次刷新也计算成有效阅读数. 这个是产品层面决定的. 看你怎么定义"阅读数"
至于cache 可以是memecache 可以是 redis. 只是为给topic减压而已. 毕竟topic本身的数据更新频率很低, 但是view_count的更新却很高 很容易造成锁. 所以累加到一定值后再写入

7年前 评论

@说好的呢 思路我大概看懂了,但是 cookies 的运用以及 其和 view_count/cache 的连接我是没有看懂

7年前 评论

@helperhaps

很简单的. cookies这里只是为了防止 单个用户重复刷新时恶意累加阅读数. 防君子. 所以使用cookie_$topid = 1 做个标记, 如果带有这个标记说明用户已经访问过了. 后续的刷新不累加查看数

如果是用户第一次查看. 那么就进行累加. 只不过只累加 cache中的 counts. 这个count累加到N时, count重置, 并写入累加到DB topic_views_counts中. 而未达到N时, 因为还是在cache中. 所以显示某个主题的真实查看量的话 应该是DB+CACHE 两者数值.

7年前 评论

@说好的呢 :clap: 好久没有写业务代码了有点懵比,总结一下就是 cookies 是作为 flag 来确定是否增加 cache 中的 view_count。

清楚明白

7年前 评论

这个很简单的问题没想到这么多人讨论哈,按照浏览次数统计就好了,无限刷新无线+,没人特别在意这个va!

4年前 评论

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