V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lookas2001
V2EX  ›  PHP

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

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

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

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

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


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

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

    低访问量分表就行

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

    count = hlen(article:id)
    nandaye
        17
    nandaye  
       2016-06-20 17:44:52 +08:00
    数据库会爆掉。。电信、银行交易数据都是放在数据库的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2501 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:39 · PVG 11:39 · LAX 19:39 · JFK 22:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.