需求场景
- 社交媒体平台:如微博、抖音、小红书等,这些平台上有大量的实时更新内容。通过使用滚动分页查询,用户可以在不刷新页面的情况下,通过滚动查看更多内容。
- 电商平台:在电商平台如淘宝、京东、拼多多、唯品会等上,商品数量巨大,无法一次性展示所有商品。因此,这些平台采用滚动分页查询,允许用户通过滚动查看更多商品,同时根据用户的滚动行为动态加载数据,减少服务器的压力。
- 新闻网站:新闻网站如今日头条通常有大量的文章和更新,滚动分页查询允许用户在不离开页面的情况下,通过滚动查看更多新闻。这提高了用户的阅读体验,并允许网站更有效地展示内容。
- 在线地图服务:如百度地图、高德地图等,这些服务需要展示大量的地理信息和实时交通数据。通过使用滚动分页查询,地图服务可以根据用户的需要动态加载和展示数据,提高地图的加载速度和用户体验。
需求分析
现在自媒体能量在互联网的赋能,通常在社交媒体平台上,我们可以发一些图文结合的笔记、关注小姐姐演员、歌手等大V。被关注的人经常更新动态他们的粉丝都能接收到。这里涉及到一种关注推送流(也叫沉浸式、投喂式流)意思是经常看什么类型的文章下一次刷新先推荐一种类型的文章。每次用最近的时间戳和下一次查询的偏移量做滚动分页查询。
Feed流怎么实现
TimeLine: 在互关好友之间可以根据时间的顺序发布的笔记进行排序。如:WX朋友圈、QQ动态。 智能算法推送:在社交媒体平台查询小姐姐穿搭、生活分享等内容推荐展示。
主要学习TimeLine的三种模式
- 推模式(读扩散)
- 拉模式(写扩散)
- 推拉混合模式(读写结合)
实现步骤
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 下一次查询的数量
效果:
1019是1015的粉丝推送的内容
传统的分页
我以前的文章主要用MySQL数据库操作了原生的分页查询: 详情: blog.csdn.net/weixin_6802…