关于 Laravel-china 阅读数的问题
首先声明,我没有看过本站的源码,只是在使用过程中发现的一个小问题,所以发帖询问一下。
每个帖子的 title 的下面都有上图所示的一个基本信息,其中最后一个阅读 660,表示的是这个帖子被阅读过的数量,那么到底该如何定义阅读过这个词呢,我想每个人都有自己的看法,就是不知道有没有一个统一的规范认知了。
本站是怎么处理的呢,我发现我自己的帖子(别人的帖子也一样),只要我刷新一下,这个数量就会 +1,个人感觉这样处理是不太妥的。
Ruby-China 中只有点击数(hit)的记录,经我测试,不论是我自己的帖子还是别人的帖子,我反复点击 hit 数量都是没有增加的。
Github 也有相关的阅读过的概念,下图是我维护的一个仓库的数据,他有记录访客和独立访客(我自己翻译的,不对请拍砖)
可以看到,有从本站进去的访客记录,当我再一次从本站相关的页面链接 跳转到相应仓库中,然后刷新之前的 Github Traffic 页面,发现两个数量都是没有变化的。
根据这个,我觉得本站的阅读数的概念应该类似 Github 中的访客的概念为稳妥。但具体是怎么实现的,或者怎么定义的,我觉得有必要重新设计一下。
不过,如果本站的最初开发者就是这么想得或者这么设计的,就那就当我没说,尊重原作者的意见也是很重要的。
写的不好,欢迎吐嘈拍砖
本帖已被设为精华帖!
本帖由 Summer
于 8年前 加精
这个字段叫:
view_count
,意为查看次数的意思。举个例子,假如你很喜欢 【肖申克的救赎】这部片,你看了 5 遍。 我问你:这部电影你看了多少次了?你应该怎么回答?1 次呢,还是 5 次呢?
产品的东西还真是蛮有趣的 :smile: ,是吧。
关于说一开始的设计构思这个问题,压根就没想,完全是怎么快怎么来,觉得要加个
view_count
,行,那就创建一个字段,然后查看的时候加一即可。他们都加了缓存,你可以打开 ruby china 页面,然后刷新 20 下试试。
Github 的话你也可以打开多个浏览器刷刷刷,你会发现都没有增长。
一般像 Github 这种访问量,并且在业务逻辑上
查看数
这个值并没有太多意义的,都会加缓存。尤其是在你查看的那个页面,那是统计,估计缓存更久,统计服务如 GA 的,承诺的是 24 内更新。统计服务如 GA(Google Analytics) 的,承诺的是 24 小时内更新。
这个问题记得之前小文(@JobsLong )也提过一次
@Summer 卧槽,刷新 20 次之后,还是一样的 hit 数,然后我打开 incognito widow 打开 hit 数就变了
我再 @ @JobsLong
@Summer 好吧,
首先我觉得不是 Rails 或者 Laravel 的关系,毕竟 Laravel 也有借鉴 Rails这应该是一个产品层面的东西,也不能说谁对谁错,仅仅是我个人觉得不妥而已。你的意思是 Ruby-China 和 Github 其实本质上也是刷新一次就记录一次,只不过没有立即显示出来,而本站是立即显示出来了,经过我的验证 Ruby-China 确实是这样子。
我记得之前拜读某大牛的文章的时候他说
原文链接 如果其他网站也是这么做的,那么简单地说就是 view 是从缓存中读取的,按照数量或者时间来触发同步。
就是觉得,每刷新一次就增加一个 view 有点不适应,就是不知道对于这个概念有没有什么最佳实践或者行业通用做法。
我个人觉得这个阅读数的概念应该是若我是作者再怎么点击什么的,阅读数都不会增加,若我是一个注册用户(按照 session 区分)或者吃瓜群众(按照 ip 区分),那么一天内(或固定时间内)多次的阅读或点击都算一次。
@Summer
看电影这个例子举的很好,问题在于如果我打开电影,看了一分钟关了,又打开一次又关了,那我算看过还是没看过呢,按照现在的逻辑是我看了两遍,可是我觉得我没看啊,这应该就是我纠结的地方。
大牛不大牛不知道,laravel china 的使用上,还没到需要去优化这个 count 的时候,提前去优化的话,完全就是过度优化。我至少能想到一百个地方比这个更加值得去优化的。
需要优化的话也蛮简单,就是那种流量超级大的时候,丢到内存缓存里,指定一个计划任务,过一段时间同步一次到数据库里。
其实需要讨论的,更多是产品层面上的东西。对了,刚刚问你的问题,假如你很喜欢 【肖申克的救赎】这部片,你看了 5 遍。 我问你:这部电影你看了多少次了?请问你会怎么回答?为什么?
按照 ip 区分
这个,一般不能用来区分独立访问用户,很多公司或者小区出口 ip 只有一个,员工和小区人口。。。GA 统计的做法是区分每一个浏览器
@helperhaps 在我看来,觉得完全没必要去纠结这些东西,完全是钻牛角尖了,跳出来想想,真的有那么重要吗?我问你看了多少次,你跟我说,第一次我看了 1 分钟,第二遍我看了两分钟,第三次我。。。。
@Summer
同意。那也就是使用 session 确定注册用户使用浏览器确定群众,我只是说一下我的理解哈。(这条貌似扯远了)
那就不纠结了,(这也加精啊)
有时候有一个参考会更好些,GA 的:
GA 对 PV 的定义是:
在这里,其实
view_count
和 Google Analytics 的 Page View 是一样的。@helperhaps 蛮有意思的话题,之前好几个人问过我,有人甚至提过 issue。加精让更多人看见,一起加入讨论
@Summer OK,其实我们两个都说到了,这个是一个产品层面的东西(我7楼 你9楼), reload 一次就 +1 处理简单粗暴,我也不知道我在纠结什么,阅读数量增加太快,感觉数据太假,之类的吧,如果帖子排序算法中有阅读量这个维度的话,就可以刷热度(是我想太多)
这里我引申一个另外的问题,这个 view_count 字段每次浏览文章就自增 +1 然后更新到数据库,假如同时访问的人很多很多,这样是不是效率很低,如何改进?
@纸牌屋弗兰克 这个的话,你可以看一下我 7 楼的贴的图片或链接,如果你觉得效率低的话,(过早优化可是大忌啊)
社区一般都这样,潜水用户挺多,刚刚在 GA 后台截的屏,相信我这个值不算高的
@Summer 53 是登录用户吧,非登录用户应该更多吧
这个方法思路挺好,view_count 不用每次浏览页面更新到数据库,而是通过缓存自增,定期从缓存写到数据库。
@纸牌屋弗兰克 恩纳,不过还是得看具体场景情况而决定是否引入缓存,这系统复杂度就上去了
这样的讨论,也蛮有意思的。
/Users/xiaop/Pictures/照片 Library.photoslibrary/Thumbnails/2016/07/10/20160710-114722/inbqoS6HTFapK32G8gl5lw/thumb_IMG_1712_1024.jpg
@xiaop 哈哈,来互相伤害啊,那个图片还没有上传上来? :smile:
@helperhaps
@xiaop Shit,完全猜不出来他要发什么图片。
@Summer 我看他之前的帖子就说上传不了图片 :ghost:
@Summer
@helperhaps
e,是这样的,我从“照片”里复制-粘贴,没有粘贴成功,直接复制粘贴照片文件也无法成功。
本来准备粘贴这个照片,我在西藏拍的罕见的7瓣格桑,据说看到的人会很幸福,
@xiaop 拖进来
@xiaop 让我们一起幸福 :metal:
@xiaop 哈哈,反正我是拖拽上传
拉进来一起幸福
上传图片这个的问题我上次遇见了.
重现:只要上传不是 jpg,png,gif 的图片,就会卡住不动了,其实这个时候已经返回了错误,只是前端没有展示这个错误信心。
@Summer summer 兄改一改,哈哈哈
@lijinma 已记录 :smile_cat:
这个确实只是产品层次的逻辑要求而已.
我通常的做法:
@说好的呢 :+1:
1 和 2 我没看太懂,既然 cookies 标记 topic_id ,但为啥 show 时, 遇到无标记则累加 cache?你的所谓的 cache 指的是什么? redis?
是不是说 cookies 在客户端标记每个浏览器所看过的 topic,这样在特定时间内(cookies 过期前)就不会阅读很多次。cache 在服务端标记所有浏览器的,在特定时间内针对一个 topic 每个浏览器只有一次阅读数
@helperhaps
cookies在这里的作用只是简单的防止 多次刷新也计算成有效阅读数. 这个是产品层面决定的. 看你怎么定义"阅读数"
至于cache 可以是memecache 可以是 redis. 只是为给topic减压而已. 毕竟topic本身的数据更新频率很低, 但是view_count的更新却很高 很容易造成锁. 所以累加到一定值后再写入
@说好的呢 思路我大概看懂了,但是 cookies 的运用以及 其和 view_count/cache 的连接我是没有看懂
@helperhaps
很简单的. cookies这里只是为了防止 单个用户重复刷新时恶意累加阅读数. 防君子. 所以使用cookie_$topid = 1 做个标记, 如果带有这个标记说明用户已经访问过了. 后续的刷新不累加查看数
如果是用户第一次查看. 那么就进行累加. 只不过只累加 cache中的 counts. 这个count累加到N时, count重置, 并写入累加到DB topic_views_counts中. 而未达到N时, 因为还是在cache中. 所以显示某个主题的真实查看量的话 应该是DB+CACHE 两者数值.
@说好的呢 :clap: 好久没有写业务代码了有点懵比,总结一下就是 cookies 是作为 flag 来确定是否增加 cache 中的 view_count。
清楚明白
@说好的呢 说的很赞
这个很简单的问题没想到这么多人讨论哈,按照浏览次数统计就好了,无限刷新无线+,没人特别在意这个va!