贴子热度存储设计

2023-12-14 20:54:52 +08:00
 doubleTrees
比如说现在我想设计一个类似微博的站点,对于里面的每个贴子有一个热度计算的算法(例如点赞加多少分,评论加多少分,再根据时间每分钟衰减百分之多少),我的问题是贴子的热度该怎么存,因为后面要根据贴子的其他字段和贴子热度进行排序和筛选,如果直接在 mysql 的贴子表里加一个热度字段,那么由于用户量很大,需要频繁更新贴子热度,效率会不会很低,如果在 redis 里面用 zset 存贴子热度,那么多字段筛选和排序都不方便。
我还想到一个方案,贴子实时热度存 redis 里,然后每个时间间隔将所有贴子的热度刷到 mysql 里,这样排序筛选的时候使用 mysql 的数据,如果要实时数据,从 redis 里面拿,请问还有别的设计方案吗?
1407 次点击
所在节点    数据库
12 条回复
GooMS
2023-12-15 02:09:19 +08:00
在 模型上实现 热度属性从 redis 取
Giftina
2023-12-15 09:49:11 +08:00
你的方案可行,线上产品有应用这样的做法
doubleTrees
2023-12-15 10:31:07 +08:00
@Giftina 但是这样的话在刷的时候需要把 mysql 所有的贴子的热度都更新,数据量很大,且只能一个一个更新。或者维护一个热度变更了的贴子列表,只更新这些贴子,但这样仍然有很多帖子。在数据量到百万千万级这个更新就很耗时了。
doubleTrees
2023-12-15 10:33:13 +08:00
@GooMS 请问这样的话带热度的多字段排序和筛选怎么做呢,比如说根据标签和热度进行筛选和排序
123123123sdf
2023-12-15 10:55:30 +08:00
@doubleTrees 热点帖子的热度更新频率较快,而普通帖子更新的频率低一点,这样设计可以吗?
GooMS
2023-12-15 10:59:34 +08:00
@doubleTrees 你需要什么筛选呢?如果是固定的几个可以为每个条件都创建集合,如果是动态且有时效性的我觉得你得考虑 Redis Stack 之类的东西
TiaoYeTaiLang
2023-12-15 11:56:31 +08:00
直写 redis ,异步刷到 mysql 不就好了吗?
doubleTrees
2023-12-15 13:49:00 +08:00
@GooMS 指的是 redisearch 吗,我去了解了一下,感觉是可以的,但是迁移成本比较大,相当于加个数据库了。
doubleTrees
2023-12-15 14:15:18 +08:00
@TiaoYeTaiLang 刷的话会把全部帖子的热度都刷一遍,会造成堵塞吧
ji76289
2023-12-15 14:30:13 +08:00
所有查询请求都到 redis ,别去 mysql 。
veni2023
2023-12-15 15:57:27 +08:00
单独维护一个各筛选条件下热度前 xx 的帖子表?这样要实时更新热度的帖子数会少很多
evalcony
2023-12-15 16:40:11 +08:00
1. 各种计算用的属性,存 redis 。更新也都是直接对 redis 更新。
2. 热度的计算,并不需要每次的数值变更都进行计算。它可以是按一定时间间隔去计算。比如秒。
3. 排序筛选的需求直接读 redis 相关属性,在内存里做。可以维护一个接口或服务单独做排序,对外提供结果。不用每个请求都去做热度计算等工作。

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

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

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

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

© 2021 V2EX