app要实现类似微博一样的热门微博功能,初步想法
这样可以得到微博的排行,但是
每次App下拉刷新及上拉加载数据时的逻辑就不清楚了, 因为是排行数据,而且各个微博的排行都可能是动态更新的,下拉和上拉都有可能加载到重复数据。
所以想知道 关于类微博 热门
是如何实现的。
还有个实现想法是, 设定一个阈值,超过该阈值就认为是热门,然后用时间作为score 刷到redis的zset, 这样每次下拉和上拉与时间对比,就不会出现重复数据的问题,这样就是 数据并不是按照排行来的,或许本该这样?
求实现的思路 - -
不清楚微博这种怎么实现,但如果是我接到这个需求可能也是用redis和sortedset,首先需要定义score或所谓的权重的算法,确保其在时间轴上其他信息相同的情况下永远是呈现增长趋势,所有写入数据都会直接zadd进去,然后用定时器去除多余的数据。
移动端的分页这个我也觉得很蛋疼,应该使用第一次查询出来的最后一条的id和score作为条件去筛选数据呈现分页
初步的版本 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
@QuaiderZ: 你说的这种情况是存在的,但这个好像没太好办法可以避免,因为每次查询的时候数据都有可能变化,如果非要这样做的话数据就不能够实时变化,这样才能将这种问题影响面降到最低