首页 新闻 会员 周边

redis - 实现类似微博热门

0
悬赏园豆:20 [待解决问题]

app要实现类似微博一样的热门微博功能,初步想法

  • 将微博及分值score刷到redis,利用zset存储

这样可以得到微博的排行,但是

每次App下拉刷新及上拉加载数据时的逻辑就不清楚了, 因为是排行数据,而且各个微博的排行都可能是动态更新的,下拉和上拉都有可能加载到重复数据。

所以想知道 关于类微博 热门 是如何实现的。


还有个实现想法是, 设定一个阈值,超过该阈值就认为是热门,然后用时间作为score 刷到redis的zset, 这样每次下拉和上拉与时间对比,就不会出现重复数据的问题,这样就是 数据并不是按照排行来的,或许本该这样?

求实现的思路 - -

QuaiderZ的主页 QuaiderZ | 初学一级 | 园豆:154
提问于:2017-09-26 15:27
< >
分享
所有回答(1)
0

不清楚微博这种怎么实现,但如果是我接到这个需求可能也是用redis和sortedset,首先需要定义score或所谓的权重的算法,确保其在时间轴上其他信息相同的情况下永远是呈现增长趋势,所有写入数据都会直接zadd进去,然后用定时器去除多余的数据。

移动端的分页这个我也觉得很蛋疼,应该使用第一次查询出来的最后一条的id和score作为条件去筛选数据呈现分页

Daniel Cai | 园豆:10424 (专家六级) | 2017-09-26 15:44

初步的版本 score 是有一套算法的 比如下面的,满足你说的 增长趋势

var locateTime = DateTime.Parse("2017-01-01 00:00:00");
var ts = (pubTime - locateTime).TotalSeconds;
var cycle = TimeSpan.FromHours(12.5).TotalSeconds;
var weight = 3 * repostNum + 2.5 * shareNum + 2 * favorNum + 1.8 * commentNum + 1.4 * collectNum + 0.5 * readNum;

return Math.Log10(weight) + ts / cycle;

但是我纠结的是,这些排行(score)也是可能更新的,假如用 lastId 和 score 去匹配,应该会有数据重复的可能,不知道我理解你的意思了没。
比如 某一时刻,排行为 A(score = 100), B(99), C(98), D(97), E(96),.... 下拉传过来的id此时为A,score = 100
用户下拉时,排行变成了 D(110), C(105), A(102), B(99)... 这时,可能重复拉取到D和C

支持(0) 反对(0) QuaiderZ | 园豆:154 (初学一级) | 2017-09-26 15:59

@QuaiderZ: 你说的这种情况是存在的,但这个好像没太好办法可以避免,因为每次查询的时候数据都有可能变化,如果非要这样做的话数据就不能够实时变化,这样才能将这种问题影响面降到最低

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2017-09-26 16:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册