关注推送的实现逻辑

注:该文章基于黑马程序员中《黑马点评》软件的学习

代码资料
提取码: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);
    }

在这里插入图片描述
在这里插入图片描述
下拉是刷新看看有没有新的笔记产生
上滑是继续浏览之前的笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值