Redis如何实现feed流
今天Redis教程栏目一起看看如何实现feed流
1 简介
朋友圈,微博,都是 Feed 流产品,还有图片分享网站 Pinterest,花瓣网等又是另一种形式的 Feed 流产品。很多 App 也都会有一个模块,叫动态或消息广场,这些也是 Feed 流产品。
核心概念
- Feed
Feed 流中的每一条状态或者消息。比如朋友圈中的一个状态就是一个 Feed,微博中的一条微博就是一个 Feed。 - Feed 流
持续更新并呈现给用户内容的信息流。每个人的朋友圈,微博关注页等等都是一个 Feed 流。 - Timeline
Feed 流的一种,微博,朋友圈都是 Timeline 类型的 Feed 流,但由于 Timeline 类型出现最早,使用最广泛,最为人熟知,有时也用 Timeline 表示 Feed 流。 - 关注页 Timeline
展示其他人 Feed 消息的页面,比如朋友圈,微博首页。 - 个人页 Timeline
展示自己发送过的 Feed 消息的页面,比如微信中的相册,微博的个人页。
2 特点
- 多账号内容流
Feed 流系统中肯定会存在成千上万的账号,账号之间可以关注,取关,加好友和拉黑等操作。只要满足这一条,那么就可以当做 Feed 流系统来设计。 - 非稳定的账号关系
由于存在关注,取关等操作,所以系统中的用户之间的关系就会一直在变化,是一种非稳定的状态。 - 读写比例 100:1
读写严重不平衡,读多写少,一般读写比例在 10:1,甚至 100:1 以上。 - 消息必达性要求高
比如发送了一条朋友圈后,结果部分朋友看到了,部分朋友没看到,如果偏偏女朋友没看到,那么可能会产生很严重的感情矛盾,后果很严重。
3 分类
- Timeline
按发布的时间顺序排序,先发布的先看到,后发布的排列在最顶端,类似于微信朋友圈,微博等。这也是一种最常见的形式。产品如果选择 Timeline 类型,那么就是认为Feed流中的Feed不多,但是每个Feed都很重要,都需要用户看到。 - Rank
按某个非时间的因子排序,一般是按照用户的喜好度排序,用户最喜欢的排在最前面,次喜欢的排在后面。这种一般假定用户可能看到的 Feed 非常多,而用户花费在这里的时间有限,那么就为用户选择出用户最想看的 Top N 结果,场景的应用场景有图片分享、新闻推荐类、商品推荐等。
4 难点
4.1 存储
因为该项目中 Feed 比较简单,就类比于空间说说,因此可以使用 MySQL存储,如果对于数据结构比较复杂的 Feed 流就要使用 NoSQL 数据库,这样存储更方便与高效,比如 MongoDB 或 HBase。
4.2 推送
在推送方案里面的,有三种方案,分别是:
拉模式
也称为读扩散,用户主动去拉取关注人的 Feed 内容。
即当一个用户(特别是关注了很多人)触发行为时,拉取自己动态,检索用户的关注表,然后根据关注表检索新发的feed。如果一个用户关注过多的时候,查询该用户的关注列表也是有很大数据成本。
推模式
也成为写扩散,当用户添加 Feed 时,会自动将 Feed 通知给关注的人(优选)。
即当一个用户触发行为(比如发微博),自身行为记录到行为表中,同时也对应到这个用户的粉丝表,为每个粉丝插入一条feed。但是对于粉丝过万的大V,为每个粉丝插入一条feed对存储数据成本很大。
使用 Redis Sorted Sets(方便按时间排序 Timeline)维护粉丝的 Feed 集合,当博主添加 Feed 时,主动将内容推送到粉丝的 Feed 集合中,这样用户可以很方便快速从集合中读取
推拉结合
比如微博,大部分用户的账号关系都是几百个,但是有个别用户是 1000 万以上才使用。
在线推,离线拉
- 大V发动态,只同步发布动态给同时在线的粉丝,离线的粉丝上线后,再去拉取动态。来完成推与拉。
定时推,离线拉
大V发动态之后,以常驻进程的方式定时推送到粉丝动态表。
5 表设计
推荐(免费):redis教程
以上是Redis如何实现feed流的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Redis集群模式通过分片将Redis实例部署到多个服务器,提高可扩展性和可用性。搭建步骤如下:创建奇数个Redis实例,端口不同;创建3个sentinel实例,监控Redis实例并进行故障转移;配置sentinel配置文件,添加监控Redis实例信息和故障转移设置;配置Redis实例配置文件,启用集群模式并指定集群信息文件路径;创建nodes.conf文件,包含各Redis实例的信息;启动集群,执行create命令创建集群并指定副本数量;登录集群执行CLUSTER INFO命令验证集群状态;使

如何清空 Redis 数据:使用 FLUSHALL 命令清除所有键值。使用 FLUSHDB 命令清除当前选定数据库的键值。使用 SELECT 切换数据库,再使用 FLUSHDB 清除多个数据库。使用 DEL 命令删除特定键。使用 redis-cli 工具清空数据。

使用 Redis 指令需要以下步骤:打开 Redis 客户端。输入指令(动词 键 值)。提供所需参数(因指令而异)。按 Enter 执行指令。Redis 返回响应,指示操作结果(通常为 OK 或 -ERR)。

使用Redis进行锁操作需要通过SETNX命令获取锁,然后使用EXPIRE命令设置过期时间。具体步骤为:(1) 使用SETNX命令尝试设置一个键值对;(2) 使用EXPIRE命令为锁设置过期时间;(3) 当不再需要锁时,使用DEL命令删除该锁。

要从 Redis 读取队列,需要获取队列名称、使用 LPOP 命令读取元素,并处理空队列。具体步骤如下:获取队列名称:以 "queue:" 前缀命名,如 "queue:my-queue"。使用 LPOP 命令:从队列头部弹出元素并返回其值,如 LPOP queue:my-queue。处理空队列:如果队列为空,LPOP 返回 nil,可先检查队列是否存在再读取元素。

Redis 使用哈希表存储数据,支持字符串、列表、哈希表、集合和有序集合等数据结构。Redis 通过快照 (RDB) 和追加只写 (AOF) 机制持久化数据。Redis 使用主从复制来提高数据可用性。Redis 使用单线程事件循环处理连接和命令,保证数据原子性和一致性。Redis 为键设置过期时间,并使用 lazy 删除机制删除过期键。

理解 Redis 源码的最佳方法是逐步进行:熟悉 Redis 基础知识。选择一个特定的模块或功能作为起点。从模块或功能的入口点开始,逐行查看代码。通过函数调用链查看代码。熟悉 Redis 使用的底层数据结构。识别 Redis 使用的算法。

Redis 作为消息中间件,支持生产-消费模型,可持久化消息并保证可靠交付。使用 Redis 作为消息中间件可实现低延迟、可靠和可扩展的消息传递。
