基于Redis实现Feed流消息推送

Feed流是持续更新用户订阅内容的信息流,常见于社交媒体和新闻应用。当用户发布新内容时,如抖音网红发布新作品,系统会使用Redis等工具将信息推送给其粉丝。粉丝登录后,通过查询接口按时间顺序获取新内容。此过程涉及数据存储、分页和避免重复数据查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是Feed流?

feed流即持续更新并呈现给用户内容的信息流。feed是将用户主动订阅的若干消息源组合在一起形成内容聚合器,帮助用户持续地获取最新的订阅源内容。

feed直接翻译是饲料的意思,其实是把用户都比喻成爱吃东西得某种动物,不断的给他喂食,满足他的需求,wiki百科上定义是一种数据格式,网站可通过它将最新信息传播给用户,用户能够订阅网站的先决条件是网站可提供持续更新的信息。

流,就是他的呈现形式,就是这个信息怎么呈现的,大多数的都是根据时间排列的形式呈现的。

应用场景

使用了feed流的APP有很多,例如:微信朋友圈、百度信息流、今日头条推荐页等等。

代码实现

模拟下抖音网红发布新作品后抄送到粉丝关注可见

public R addBLong(Blog blog) {
        //获取当前用户信息
        UserDto userDto = threadLocal.get();
        //新增数据
        boolean isSuccess = save(blog.setUserId(userDto.getId()));
        if (!isSuccess) {
            return R.error("新增失败");
        }
        //查询作者的所有粉丝
        List<Follow> follows = followService.query()
                .eq("follow_user_id", userDto.getId()).list();
        //推送给所有粉丝
        String key = "all:follows:";
        follows.stream().forEach(
                follow -> stringRedisTemplate.opsForZSet().add(
                        key + follow.getUserId(),
                        blog.getId(),
                        System.currentTimeMillis()));
        return R.ok().data("data", blog.getId());
    }

粉丝登陆后查询接口实现

public R queryBLongOfFollow(Long max, Integer offset) {
        //获取当前用户id
        String userId = threadLocal.get().getId();
        //key
        String key = "all:follows:" + userId;
        //查询收件箱
        Set<ZSetOperations.TypedTuple<String>> typedTuples = stringRedisTemplate.opsForZSet().
                reverseRangeByScoreWithScores(key, 0, max, offset, 2);
        if (typedTuples == null || typedTuples.isEmpty()) {
            return R.ok();
        }
        //笔记id集合
        ArrayList<String> listIds = new ArrayList<>(typedTuples.size());
        //记录最小的时间戳
        long minTime = 0;
        //offset最小的时间戳出现的个数,用来跳过相同分数避免重复数据查询
        int os = 1;
        for (ZSetOperations.TypedTuple<String> tuple : typedTuples) {
            //笔记id
            String blogId = tuple.getValue();
            listIds.add(blogId);
            //时间戳
            long time = tuple.getScore().longValue();
            if (minTime == time) {
                os++;
            } else {
                minTime = time;
                os = 1;
            }
        }
        //将笔记id集合以,拼接
        String idsStr = StrUtil.join(",", listIds);
        //按照顺序查询笔记集合
        List<Blog> blogList = query().in("id", listIds)
                    .last("order by field(id," + idsStr + ")").list();
        for (Blog b : blogList) {
            isLikeBLong(b);
            if (b == null) {
                return R.error("查询失败");
            }
            User user = userService.query().eq("id", b.getUserId()).one();
            b.setUser(user);
        }
        ScrollResult result = new ScrollResult();
        result.setList(blogList);
        result.setMinTime(minTime);
        result.setOffset(os);
        return R.ok().data("result",result);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值