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

贴子热度存储设计

  •  
  •   doubleTrees · 2023-12-14 20:54:52 +08:00 · 1396 次点击
    这是一个创建于 373 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如说现在我想设计一个类似微博的站点,对于里面的每个贴子有一个热度计算的算法(例如点赞加多少分,评论加多少分,再根据时间每分钟衰减百分之多少),我的问题是贴子的热度该怎么存,因为后面要根据贴子的其他字段和贴子热度进行排序和筛选,如果直接在 mysql 的贴子表里加一个热度字段,那么由于用户量很大,需要频繁更新贴子热度,效率会不会很低,如果在 redis 里面用 zset 存贴子热度,那么多字段筛选和排序都不方便。
    我还想到一个方案,贴子实时热度存 redis 里,然后每个时间间隔将所有贴子的热度刷到 mysql 里,这样排序筛选的时候使用 mysql 的数据,如果要实时数据,从 redis 里面拿,请问还有别的设计方案吗?
    GooMS
        1
    GooMS  
       2023-12-15 02:09:19 +08:00 via Android
    在 模型上实现 热度属性从 redis 取
    Giftina
        2
    Giftina  
       2023-12-15 09:49:11 +08:00
    你的方案可行,线上产品有应用这样的做法
    doubleTrees
        3
    doubleTrees  
    OP
       2023-12-15 10:31:07 +08:00
    @Giftina 但是这样的话在刷的时候需要把 mysql 所有的贴子的热度都更新,数据量很大,且只能一个一个更新。或者维护一个热度变更了的贴子列表,只更新这些贴子,但这样仍然有很多帖子。在数据量到百万千万级这个更新就很耗时了。
    doubleTrees
        4
    doubleTrees  
    OP
       2023-12-15 10:33:13 +08:00
    @GooMS 请问这样的话带热度的多字段排序和筛选怎么做呢,比如说根据标签和热度进行筛选和排序
    123123123sdf
        5
    123123123sdf  
       2023-12-15 10:55:30 +08:00
    @doubleTrees 热点帖子的热度更新频率较快,而普通帖子更新的频率低一点,这样设计可以吗?
    GooMS
        6
    GooMS  
       2023-12-15 10:59:34 +08:00
    @doubleTrees 你需要什么筛选呢?如果是固定的几个可以为每个条件都创建集合,如果是动态且有时效性的我觉得你得考虑 Redis Stack 之类的东西
    TiaoYeTaiLang
        7
    TiaoYeTaiLang  
       2023-12-15 11:56:31 +08:00
    直写 redis ,异步刷到 mysql 不就好了吗?
    doubleTrees
        8
    doubleTrees  
    OP
       2023-12-15 13:49:00 +08:00
    @GooMS 指的是 redisearch 吗,我去了解了一下,感觉是可以的,但是迁移成本比较大,相当于加个数据库了。
    doubleTrees
        9
    doubleTrees  
    OP
       2023-12-15 14:15:18 +08:00
    @TiaoYeTaiLang 刷的话会把全部帖子的热度都刷一遍,会造成堵塞吧
    ji76289
        10
    ji76289  
       2023-12-15 14:30:13 +08:00
    所有查询请求都到 redis ,别去 mysql 。
    veni2023
        11
    veni2023  
       2023-12-15 15:57:27 +08:00
    单独维护一个各筛选条件下热度前 xx 的帖子表?这样要实时更新热度的帖子数会少很多
    evalcony
        12
    evalcony  
       2023-12-15 16:40:11 +08:00
    1. 各种计算用的属性,存 redis 。更新也都是直接对 redis 更新。
    2. 热度的计算,并不需要每次的数值变更都进行计算。它可以是按一定时间间隔去计算。比如秒。
    3. 排序筛选的需求直接读 redis 相关属性,在内存里做。可以维护一个接口或服务单独做排序,对外提供结果。不用每个请求都去做热度计算等工作。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1304 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:35 · PVG 01:35 · LAX 09:35 · JFK 12:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.