如何实现帖子浏览量统计功能? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lookas2001
V2EX    PHP

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

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

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

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

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


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

    除非你的每月活跃用户有过十万,每个用户读取帖子数过千,否则没必要用非数据库的解决方案
    dphdjy
        11
    dphdjy  
       2016 年 6 月 19 日 via Android
    PV vs UV

    低访问量分表就行

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

    count = hlen(article:id)
    nandaye
        17
    nandaye  
       2016 年 6 月 20 日
    数据库会爆掉。。电信、银行交易数据都是放在数据库的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2830 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 74ms UTC 09:38 PVG 17:38 LAX 02:38 JFK 05:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86