如何实现帖子浏览量统计功能?

2016-06-19 12:33:39 +08:00
 lookas2001
rt ,网站想要实现一个统计浏览量(类似 segmentfault )的功能,要求是,多个用户访问同一个帖子浏览量算作一次,为登录用户浏览不算次数。该如何实现?
同样的,收藏应该如何实现?
谢~
PS 百度上搜索的结果一堆是采用第三方统计的。。并不考虑。
另外有人说可以用 MySQL 单独设计一个表统计浏览量,但是感觉这样数据库会爆掉。
怎么办。
是不是需要上类似 Redis 这样的内存数据库?
5799 次点击
所在节点    PHP
17 条回复
manhere
2016-06-19 12:37:43 +08:00
“多个用户访问同一个帖子浏览量算作一次”,不是很理解这句,既然如此,还统计啥?
lyragosa
2016-06-19 12:38:57 +08:00
多个用户访问同一个帖子浏览量算作一次???
SlipStupig
2016-06-19 12:46:12 +08:00
“多个用户访问同一个帖子浏览量算作一次” 这个就是发一个帖子有人访问就为 1 ,没人访问就为 0 ,时间日期都不用考虑了,没意义
Ouyangan
2016-06-19 12:48:48 +08:00
数据库没你想的那么脆弱吧
qiayue
2016-06-19 13:03:32 +08:00
估计楼主写错了,是一个用户在不同的时间浏览同一个帖子都只算作一次
如果是这样的话,你就需要在某个地方存储,某个人是否浏览过某个帖子的数据
然后这又是需要长期存储的数据,所以直接放数据库里就行了,没必要放 redis
liuhaotian
2016-06-19 13:06:46 +08:00
访问量多少?数据库多少数据量?
1000w 以下不用考虑数据库
airyland
2016-06-19 13:19:40 +08:00
直接上 influxdb 吧,自从解决 timezone 问题后很好用了。
odirus
2016-06-19 13:50:16 +08:00
提供另外一个思路:
假设用户通过 nginx 访问你的 web 服务,你阔以修改 nginx 日志记录设置,记录用户的 cookie 信息(只要能够表示用户唯一身份即可),添加到 access_log 信息中。

如果你需要及时计算,可以使用 Spark streaming ,如果你不需要及时计算,可以定时一段时间计算一次日志内的信息,利用 Spark SQL ,可以像 MySQL 一样起送自如。

计算后的日志就可以存储到文件 or 数据库。

以上方式的好处是不影响用户体验,只对 web 服务器日志进行分析,只要保留用户日志,随时都可以重新计算。
odirus
2016-06-19 13:51:23 +08:00
o , PHP 节点,如果会一点 Python 的话就可以轻松使用 spark SQL 了。
hp3325
2016-06-19 14:29:19 +08:00
建张用户帖子表,用户 ID 和帖子 ID 作为唯一索引,更新帖子点击数前往这个表插记录,能插进去才更新点击数。


为防止数据爆掉,加个条件,帖子最后回复时间超过 60 天就不算点击数,同时维护脚本加入定期清理用户帖子表。

除非你的每月活跃用户有过十万,每个用户读取帖子数过千,否则没必要用非数据库的解决方案
dphdjy
2016-06-19 14:32:43 +08:00
PV vs UV

低访问量分表就行

至于高并发情况下
内存计数器+定时持久化
Redis+MySQL 就是相对常用的组合
也可以自己建其他内存缓存方案
lookas2001
2016-06-19 16:44:46 +08:00
谢大家回答。
访问量基本为 0 。。。
先用 MySQL 做一个用户-帖子表来记录就好。。
等用户量大了再换吧。。
总之,谢大家回答
lslqtz
2016-06-19 17:13:39 +08:00
@lookas2001 我觉得,可以改为每天计一次。
否则你的 MySQL 压力会崩的,用 Memcache 或者 Redis , 86400 秒。
qcloud
2016-06-19 17:17:25 +08:00
piwik
SlipStupig
2016-06-19 22:02:14 +08:00
@lslqtz 没多大压力一个 uid ,对应一个或多个帖子的访问 ID ,说实话压力真心不大,如果你有一百万用户和 50 个帖子,这些用户每天一发消息全部上线,日 update 次数也就是 5 千万次,分布到一天下来每秒查询没多少流量,我之前用 mysql 做游戏数据库每天就 100 多个人玩大概日流量 100G 流量稳稳的没崩溃跑了三个月, mysql 真心没你想的那么脆弱
lxm
2016-06-20 12:28:58 +08:00
hset article:id userid time()

count = hlen(article:id)
nandaye
2016-06-20 17:44:52 +08:00
数据库会爆掉。。电信、银行交易数据都是放在数据库的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/286807

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX