Redis滚动分页的使用

这篇具有很好参考价值的文章主要介绍了Redis滚动分页的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Feed流

关注推送也叫Feed流。通过无限下拉刷新获取新的信息。

Redis滚动分页的使用,redis

Feed流产品常见有两种模式:

Timeline: 不做内容筛选,简单的按照内容发布时间排序,常用于好友或关注。例如朋友圈

优点:信息全面,不会有缺失。并且实现也相对简单

缺点:信息噪音较多,用户不一定感兴趣,内容获取效率低。

智能排序:利用智能算法屏蔽掉违规的、用户不感兴趣的内容。推送用户感兴趣信息来吸引用户

优点:投喂用户感兴趣信息,用户粘度很高,容易沉迷

缺点:如果算法不精准,可能起到反作用。

Timeline模式的实现方案有三种:拉模式、推模式、推拉结合

拉模式

拉模式也叫读扩散。这是因为,进行阅读的用户本身不接受任何数据,当开始阅读时,才会将关注的内容拉取。模型图如下

Redis滚动分页的使用,redis

优点:

节省内存空间,因为收件箱阅读结束后就会清空,相当于消息只在个人的发件箱中保存了一份。

缺点:

耗时较久,因为除了需要拉取消息外,还需要对消息进行排序,这个过程比较耗时,当一个用户关注的人较多,一次性拉取的消息过多这个耗时会更久。

推模式

推模式也叫写扩散。这是因为当一个人发表动态时,会将该信息推送到每个关注他的收件箱。

Redis滚动分页的使用,redis

优点:

延时低,当粉丝读取消息时,已经是一个排序好的数据。

缺点:

占用内存空间,同一份消息需要存储n份。当一个人粉丝很多时,存储过多重复数据。

推拉结合

也叫读写混合,兼具推拉两种模式的优点。

Redis滚动分页的使用,redis

粉丝数量多的账号拥有一个发件箱,发件箱会推送给活跃用户的收件箱,而对于普通用户不经常使用的,采取拉模式,当开始阅读时,主动从发件箱中拉去。对于粉丝数量不多的一般用户,直接采取推模式即可。

三种模式对比

拉模式

推模式

推拉结合

写比例

读比例

用户读取延迟

实现难度

复杂

简单

很复杂

使用场景

很少使用

用户量少,没有大V

过千万用户量,存在大V

Feed流的分页问题

我们通常对一个页面能够展示的数据有一定限制,因此当收件箱存在很多数据时,我们需要实现分页功能。如何实现Feed流的分页功能是一个复杂的问题,如果采用MyBatis中的分页插件是不能满足分页功能的,因为Feed流是一个动态的,数据会不断更新,因此数据的角标会不停更新,当我们需要查询第5-10条的数据时,可能又保存了一个新的数据到数据库,从而导致我们分页查找的数据存在与上一次查询的数据重复的问题,具体问题流程图如下。

Redis滚动分页的使用,redis

因此我们需要采用滚动分页,所谓滚动分页就是每次查询过数据库后,我们需要记录这一次查询结果的最后一条数据,下一次查询时,从上一次的最后一条开始往后查。流程图如下

Redis滚动分页的使用,redis

而满足滚动分页的Redis数据结构只有ScoreSet,记录每次执行结束后最后一个数据的分数,下一次查询时,从该分数的下一个开始查询。因为我们要根据时间进行排序,因此,这里的分数应该是时间戳。那么实现滚动分页的语句应该为

ZRANGEBYSCORE key -inf +inf WITHSCORES LIMT offset count

命令解释:

  • -inf:表示最小值
  • +inf:表示最大值,这样可以在不知道分数的情况下,对全部的值进行操作
  • offset:偏移量,表示当前数据之后第几个偏移量后开始获取元素
  • count:需要获取元素的数量

在我们实际开发中,还需要注意一个问题就是score重复的问题。对于score重复我们应该记录本次查询结果中,最小score的数量,来充当下一次的偏移量,比如说我在Redis中存在如下几个数据

Redis滚动分页的使用,redis

如果我们一次查询3条数据,在记录到当前查询的最小分数后,下次查询时指定偏移量为1时,那么可能会存在如下问题

zrevrangebyscore feed:test +inf -inf withscores limit 0 3

Redis滚动分页的使用,redis

此时我们查找到m5与n5,接下来我们应该从i5开始查找,那么如果将偏移量设置为 1 进行测试观察结果

zrevrangebyscore feed:test 5 -inf withscores limit 1 3

Redis滚动分页的使用,redis

可以看到,他是从第一个分数等于5的开始计算,获取之后的三个元素,因此,我们需要在开发中,对偏移量进行计算,方便我们下次进行查询时设置偏移量,大概的Java代码如下文章来源地址https://www.toymoban.com/news/detail-756559.html

//lastId指的是本次查询的最小分数值
//offset指的是偏移量
public Result queryPage(Long lastId, Integer offset) {
    //2、查询属于自己的收件箱
    Set<ZSetOperations.TypedTuple<String>> typedTuples =
            stringRedisTemplate.opsForZSet()
                    .reverseRangeByScoreWithScores(FEED_KEY, 0, lastId, offset, 3);
    //如果set等于null
    if (typedTuples==null || typedTuples.isEmpty()){
        return Result.ok();
    }
    //3、解析数据minTime
    //记录最小分数
    long score=0;
    //记录偏移量
    int os=1;
    List<String> pageValue=new ArrayList<>(typedTuples.size());//设置列表长度为typedTuples的大小
    for (ZSetOperations.TypedTuple<String> typedTuple : typedTuples) {
        String value = typedTuple.getValue();
        //将查询的数据存储在集合中
        pageValue.add(value);
        //记录当前分数
        long time = typedTuple.getScore().longValue();
        if (time==score){
        	//如果当前分数相同,则偏移量加1 
            os++;
        }else {
            //如果不同,说明当前的分数更低,刷新偏移量
            score=time;
            os=1;
        }
    }
    //返回最小的分数以及偏移量供下次调用时使用。
    Pages pages = new Pages();
    pages.setPageValue(pageValue);
    pages.setLastId(score);
    pages.setOffset(os);
    return Result.ok(pageValue);
}

到了这里,关于Redis滚动分页的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mybatis (3)-----分页的运用

    目录 一、分页查询 二,特殊的字符处理 三、总结 前言:在我们上篇已经学的动态sql的基础上,今天继续讲解关于maybatis的分页,特殊的字符处理。希望这篇博客可以帮助到大家哦! 为什么要重写mybatis的分页? 重写MyBatis的分页功能有几个原因。 首先,MyBatis默认的分页功能

    2024年02月11日
    浏览(30)
  • 基于vue+element 分页的封装

    分页也是我们在实际应用当中非常常见的存在,其实分页本身在element中做的就挺好的了,但是使用确实非常的多,所以还是有必要封装一下,主要是为了减少代码的冗余,以及提升开发的效率和降低后续维护的成本。 这是一段普通分页的示例 效果是这样的 在这当中用到了我

    2024年02月15日
    浏览(32)
  • SpringBoot实现分页的三种方式

    一 自己封装Page对象实现 博客链接 二 使用sql实现分页 2.1 场景分析 前段传递给给后台什么参数? 当前页码 currentPage 每页显示条数 pageSize 后台给前端返回什么数据? 当前页数据 List 总记录数 totalCount 2.2 前段代码 2.3 后端代码 PageBean mapper service impl controller 三 使用PageHelper插件

    2024年02月10日
    浏览(36)
  • es中3种分页的介绍以及对比

    类型 原理 优点 缺点 使用场景 from + size 类似 msql的 limit 0,100;  limit  from,size 灵活性好,实现简单,适合浅分页 无法实现深度分页问题 ,当查询数量超过10000就会报错 top10000以内的查询 Scroll 首次查询会在内存中保存一个历史快照以及游标(scroll_id),记录当前消息查询的终

    2024年02月03日
    浏览(38)
  • 学会Mybatis框架:一文掌握MyBatis与GitHub插件分页的完美结合【三.分页】

    接下来看看由辉辉所写的关于Mybatis的相关操作吧 目录 🥳🥳Welcome Huihui\\\'s Code World ! !🥳🥳 一.Mybatis分页 1. Mybatis自带分页 2.插件分页 二.特殊字符的操作 1.使用CDATA区间 2.实体引用 三.结果集的处理   其实Mybatis本身是有分页的功能的,但是我们还是需要重写其中的分页,这

    2024年02月11日
    浏览(36)
  • java中实现分页的常见几种方式

    无论是自我学习中,还是在工作中,固然会遇到 与前端搭配实现分页的功能 ,发现有几种方式,特此记录一下。 分页功能直接交给前端实现 (根据业务场景且仅仅只能用于 数据量少 的情况)。即后端不做任何数据的限制,直接把全部数据返回给前端,前端通过组件实现分页

    2023年04月10日
    浏览(28)
  • 在Element-ui的table表格中,如何让分页的序号延续上一页的序号

    题:在使用element-ui 的table表格时,会发现它每一页的序号都会从1开始,那怎么才能让它延续上一页的序号呢? index属性写明了如果设置了  type=index ,可以通过传递  index  属性来自定义索引

    2024年02月13日
    浏览(30)
  • 关于BootStrap的前端简易样式和简单分页的实现

    理想如下:  以学生登录系统为例,下方代码能够搭建基本的左侧导航栏,右侧内容的框架  导航栏中每一行用超链接表示,a 指向对应的controller层方法,target=\\\"iframe_a\\\" 指向右侧内容 ,最终实现在iframe_a容器中显示conroller层调用的方法显示的界面 如下所示,点击报修后 任意

    2024年01月24日
    浏览(43)
  • MyBatis-Plus 实现分页的几种写法

    MyBatis-Plus (opens new window) (简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 无侵入 :只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小 :启动即会自动注入基本 CURD,性能基本无损

    2024年01月20日
    浏览(35)
  • ElasticSearch深度分页并可以小幅度跳页的实现

    最近项目上有个日志采集,我作为接收端接收udp发送过来的报文数据缓存到es上,然后查询es上的数据分页展示。但是之后我发现es对分页支持很不友好,它分为深分页与浅分页,浅分页就是MySQL里的limit,但是他最大展示长度只能到10000,也就是说当每页100条数据的话,只能翻

    2023年04月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包