注:该文章基于黑马程序员中《黑马点评》软件的学习
代码资料
提取码:eh11
关注推送
又叫Feed流,直译为投喂。为用户持续提供“沉浸式”的体验,通过无限下拉刷新获取新的信息
Feed流产品常见的俩种模式
TimeLine: 不做内容筛选,简单的按照内容发布时间排序
优点: 信息全面,不会有缺失。实现也相对简单
缺点: 信息噪音多,用户不一定感兴趣,内容获取效率低
例子: QQ空间,朋友圈
智能排序: 利用只能算法屏蔽掉违规的,用户不感兴趣的内容。推送用户感兴趣信息来吸引用户
优点: 投喂用户感兴趣信息,用户黏度很高,容易沉迷
缺点: 如果算法不精准,可能起到反作用
例子: 抖音
关于TimeLine的三种实现方式
1.拉模式
每个人更新动态的时候都会在存一份数据在发件箱,关注的人会从发件箱中获取关注人的最新动态
特点: 节省内存空间但是耗时久延迟高
2.推模式
当用户要发消息的时候,会将消息推送到所有粉丝的收件箱里面
特点: 延迟低,但是内容消耗大
3.推拉结合模式
普通人用推模式发送给每一个粉丝
大V更新消息时,会在发件箱存一份,给活跃粉丝的收件箱存一份,活跃粉丝获取消息延迟更低,普通粉丝读取时再从大V发件箱中拉取
拉模式的代码实现
1.保存博客推送给粉丝的redis中记录下来
@Override
public Result saveBlog(Blog blog) {
//获取用户
UserDTO user=UserHolder.getUser();
blog.setUserId(user.getId());
//保存探店笔记
boolean isSuccess = save(blog);
if(!isSuccess){
return Result.fail("更新笔记失败");
}
//查询笔记作者的所有粉丝
List<Follow> follows = followService.query().eq("follow_user_id", user.getId()).list();
for (Follow follow : follows){
Long userId = follow.getUserId();
String key = FEED_KEY + userId;
stringRedisTemplate.opsForZSet().add(key,blog.getId().toString(),System.currentTimeMillis());
}
return Result.ok(blog.getId());
}
2.粉丝的笔记显示
@Override
public Result queryBlogOfFollow(Long max, Integer offset) {
//获取当前用户
Long userId = UserHolder.getUser().getId();
String key = FEED_KEY + userId;
Set<ZSetOperations.TypedTuple<String>> typedTuples = stringRedisTemplate.opsForZSet()
.reverseRangeByScoreWithScores(key, 0, max, offset, 2);
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;
}
}
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);
}
ScrollResult r = new ScrollResult();
r.setList(blogs);
r.setOffset(os);
r.setMinTime(minTime);
return Result.ok(r);
}
下拉是刷新看看有没有新的笔记产生
上滑是继续浏览之前的笔记