在相识了上述的三种实现方式的优劣后,选择通过推模式来实现关注推送的功能。而在选择 Redis 中的数据结构来保存消息时,尤其是消息会随着时间不停的更新的情况下,不会选择使用 List 而是使用 SortedSet,由于 List 不支持滚动分页查询,其只支持角标或是首尾查询;而 SortedSet 可以通过分数(score)来排序,支持范围查询和分页查询,更得当处理消息随时间更新的情况。 ● 第一步:需要先改造原先的发布博客的部分代码,在发布后将对应博客的 Id 发送给全部粉丝来实现推送。
if (typedTuples == null || typedTuples.isEmpty()){
return Result.ok();
}
List<Long> ids = new ArrayList<>(typedTuples.size());
long minTime = 0;
int os = 1;
for (ZSetOperations.TypedTuple<String> tuple : typedTuples) {
ids.add(Long.valueOf(tuple.getValue()));
long time = tuple.getScore().longValue();
if (time == minTime) {
os++;
}else {
minTime = time;
os = 1;
}
}
//4.根据 Id 查询 blog
String idStr = StrUtil.join(",", ids);
List<Blog> blogs = query().in("id", ids)
.last("order by field(id," + idStr + ")").list();
for (Blog blog : blogs) {
//查询笔记状态
queryBlogUser(blog);
isBlogLiked(blog);
}
//5.封装并返回
ScrollResult r = new ScrollResult();
r.setList(blogs);
r.setOffset(os);
r.setMinTime(minTime);
return Result.ok(r);
}
复制代码
传入的两个参数分别对应 Redis 命令中的 max 和 offset,获取到当前用户的 id 与前缀举行拼接后查询收件箱得到对应关注用户的更新博客的 id 集合。判断数据非空后对集合举行处理,主要是将其中的 id 存入新的集合中,并用 os 统计其中具有相同最小时间的数据的个数作为下一次查询的 offset。
接着就是根据博客的 id 从数据库中举行查询得到全部博客,但 MP 中普通的 listById 方法是根据 in 来举行查询的,并不能举行排序,以是需要通过 order by 来排序,其中的 idStr 通过 StrUtil 中的 join 方法拼接后得到。