springboot整合redis结构sorted set做滚动分页

318 阅读3分钟

需求场景

  1. 社交媒体平台:如微博、抖音、小红书等,这些平台上有大量的实时更新内容。通过使用滚动分页查询,用户可以在不刷新页面的情况下,通过滚动查看更多内容。
  2. 电商平台:在电商平台如淘宝、京东、拼多多、唯品会等上,商品数量巨大,无法一次性展示所有商品。因此,这些平台采用滚动分页查询,允许用户通过滚动查看更多商品,同时根据用户的滚动行为动态加载数据,减少服务器的压力。
  3. 新闻网站:新闻网站如今日头条通常有大量的文章和更新,滚动分页查询允许用户在不离开页面的情况下,通过滚动查看更多新闻。这提高了用户的阅读体验,并允许网站更有效地展示内容。
  4. 在线地图服务:如百度地图、高德地图等,这些服务需要展示大量的地理信息和实时交通数据。通过使用滚动分页查询,地图服务可以根据用户的需要动态加载和展示数据,提高地图的加载速度和用户体验。

需求分析

现在自媒体能量在互联网的赋能,通常在社交媒体平台上,我们可以发一些图文结合的笔记、关注小姐姐演员、歌手等大V。被关注的人经常更新动态他们的粉丝都能接收到。这里涉及到一种关注推送流(也叫沉浸式、投喂式流)意思是经常看什么类型的文章下一次刷新先推荐一种类型的文章。每次用最近的时间戳和下一次查询的偏移量做滚动分页查询。

Feed流怎么实现

TimeLine: 在互关好友之间可以根据时间的顺序发布的笔记进行排序。如:WX朋友圈、QQ动态。 智能算法推送:在社交媒体平台查询小姐姐穿搭、生活分享等内容推荐展示。

主要学习TimeLine的三种模式

  • 推模式(读扩散)

image.png

  • 拉模式(写扩散)

image.png

  • 推拉混合模式(读写结合)

image.png

实现步骤

1、新增笔记,在保存到数据库的同时,推送到(关注的发笔记人)粉丝的收件箱redis的sorted set结构

2、收件箱满足可以根据时间戳排序,必须用Redis的数据结构实现

3、查询收件箱数据时,可以实现滚动分页查询

redis设计

写的笔记推送到(关注发笔记人)粉丝的收件箱,收件箱满足可以根据时间戳排序 
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...] 
stringRedisTemplate.opsForZSet().add(CACHE_FEED_KEY + userId, blog.getId().toString(), System.currentTimeMillis());

key: 关注人userId value: Blog笔记id score表示当前时间戳
滚动分页查询 
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]

Set<ZSetOperations.TypedTuple<String>> typedTuples = stringRedisTemplate.opsForZSet()
        .reverseRangeByScoreWithScores(CACHE_FEED_KEY + userId, 0, max, offset, 3);

key: 关注人userId value部分:start起始索引 stop最大索引 offset偏移查询的pagesize count查询了几条数据 lastId 最近的查询时间戳,offset 下一次查询的数量

效果:

image.png

image.png

1019是1015的粉丝推送的内容

image.png

传统的分页

我以前的文章主要用MySQL数据库操作了原生的分页查询: 详情: blog.csdn.net/weixin_6802…