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

“昨日浏览最多的图片”这种数据库最简单的实现方式该怎么设计?

  •  
  •   alwayshere · 2018-10-22 11:00:09 +08:00 · 3250 次点击
    这是一个创建于 1984 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前每张图片都有一个记录浏览量的 views 字段,用户浏览一次则 views+1,想在网站首页每天都显示昨日浏览量最多的图片,并且按降序排列,取前 1000 个结果,怎样以一种最简单的方式来实现? MySQL 或者 nosql (比如 redis 或者 ssdb )都可以

    18 条回复    2018-10-22 16:18:20 +08:00
    w516322644
        1
    w516322644  
       2018-10-22 11:01:45 +08:00
    你不都说出来了吗?
    alwayshere
        2
    alwayshere  
    OP
       2018-10-22 11:03:36 +08:00
    @w516322644 我要的是“每天的昨天”
    luoyou1014
        3
    luoyou1014  
       2018-10-22 11:11:57 +08:00
    把浏览记录都记到一张表中。

    select pic_id, count(*) as view_num from view_record group by pic_id order by view_num desc
    opengps
        4
    opengps  
       2018-10-22 11:11:58 +08:00
    你确实已经说出来了,我给你换个说法你重新理解下:
    有个访问记录表,没访问一次多一条记录,至于你想取哪一天,就去 count 哪个时间段排序吧
    像这种增长会很快的表,建议单独用一个表做统计结果,别每次 count
    luoyou1014
        5
    luoyou1014  
       2018-10-22 11:12:48 +08:00
    @luoyou1014 忘了加 where time < today and time >= yesterday
    ZhLTE
        6
    ZhLTE  
       2018-10-22 11:17:27 +08:00
    定时查询 ,然后缓存
    iyaozhen
        7
    iyaozhen  
       2018-10-22 11:18:37 +08:00 via Android
    每天零点算一次,存下来。相当于每天打个快照
    x86
        8
    x86  
       2018-10-22 11:19:57 +08:00   ❤️ 1
    存 redis,晚上 0 点同步到数据库
    xiaoyong
        9
    xiaoyong  
       2018-10-22 11:20:03 +08:00
    简单粗暴的办法。
    如果只需要昨天和今天,不需要查询除这 2 天以外的数据的话,只需要在图片表中增加 2 个字段分别记录“今天浏览量”和“昨天浏览量”即可。每天零点服务器自动执行一个计划任务,把“今天浏览量”数据复制到“昨天浏览量”字段,之后把“今天浏览量”清零。
    lhx2008
        10
    lhx2008  
       2018-10-22 11:20:58 +08:00 via Android
    最简单的方法就是 redis 两个 key,一个 key 是今天,一个 key 是昨天,然后每天把 今天的 key 改名为昨天的 key。
    然后数据结构是 hash,用 redis 的 incrase + 1
    amon
        11
    amon  
       2018-10-22 11:21:12 +08:00
    写个定时任务,第二天凌晨查询前一天的数据,然后缓存或者放到另一张表里。
    这样方便后续的历史最热,以及二次统计每周、每月等等。
    Livid
        12
    Livid  
    MOD
       2018-10-22 11:22:26 +08:00   ❤️ 1
    如果数据量不是很大的话,可以用 Redis 的 sorted sets:

    https://redis.io/commands#sorted_set
    lhx2008
        13
    lhx2008  
       2018-10-22 11:26:10 +08:00 via Android
    也可以不改名,用日期做 key 就行,调用的时候拼一下今天的日期
    PulpFunction
        14
    PulpFunction  
       2018-10-22 11:35:57 +08:00   ❤️ 2
    还要考虑到随机,不然天天的最热就那几张图片排名靠前
    另外不要 12 点更新,凌晨 3 点往后
    virusdefender
        15
    virusdefender  
       2018-10-22 12:47:28 +08:00
    redis zscore
    jevonszmx
        16
    jevonszmx  
       2018-10-22 13:01:50 +08:00
    用户前台显示的数量、每次浏览 view+1、排序,都用 redis 实现,按日期做 key 存,sorted sets 格式;
    每天定时统计旧的数据,存入数据库,如果怕出问题,可以用定时脚本定时(比如 5 分钟)把 redis 数据同步到数据库;


    不推荐用数据库来做这种事情,吃力不讨好。
    az402
        17
    az402  
       2018-10-22 13:44:16 +08:00
    不改表结构的话 views 字段继续按次累加
    然后定时每天打一个总次数的快照 昨天次数 = 昨天总次数快照 - 前天总次数快照
    根据日期 limit 2 然后减一下
    whh945atsyzx
        18
    whh945atsyzx  
       2018-10-22 16:18:20 +08:00
    LRU
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3948 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:21 · PVG 18:21 · LAX 03:21 · JFK 06:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.