面试官:要不你给我说说啥是Feed流吧?要多突出细节哟!

黑马点评项目深度拆解:Redis在缓存穿透、秒杀超卖与Feed流场景的实战应用 在Java后端开发中,Redis凭借丰富的数据结构和原子性操作,成为应对高并发场景的核心组件。掌握其底层原理与工程实践,如缓存穿透的空值缓存方案、秒杀场景下的Lua脚本与乐观锁机制,是提升系统稳定性和数据一致性的关键。以黑马点评项目为典型案例,深入剖析Redis在短信登录、商户缓存、附近商铺搜索、签到统计及关注Feed流推送等多业务模块中的具体落地方式,能够帮助开发者理解技术选型背后的取舍逻辑,并将知识体系有效转化为面试与项目实践中的核心优势。 阅读详情

原文地址:https://www.cnblogs.com/Finley/p/16857008.html

今天我们回来看看小明和他的「淘金网」的故事。

「淘金网」里有一个页面叫「关注页」,关注页的逻辑十分常见就是将用户关注的创作者发表的文章聚合在一起,按时间倒序排列即可。

图片

这种产品形态在业内一般被叫做 Feed 流,Feed 流产品在我们手机APP中几乎无处不在,比如微信朋友圈、新浪微博、今日头条等。

只要大拇指不停地往下划手机屏幕,就有一条条的信息不断涌现出来。

就像给宠物喂食一样,只要它吃光了就要不断再往里加,故此得名Feed(饲养)。

Feed 流产品一般有两种形态。

一种是基于算法推荐,另一种是基于关注关系并按时间排列。

「关注页」这种按时间排序的 Feed 流也被为 Timeline。

「关注页」自然的也被称为「关注 Timeline」, 存放自己发送过的 Feed 的页面被称为「个人 Timeline」 比如微博的个人页。

就是这么个 Feed 流系统让「淘金网」的工程师分成拉模型和推模型两派吵作一团,一直吵到了小明办公室。。。

拉模型

一部分工程师认为应该在查询时首先查询用户关注的所有创作者 uid,然后查询他们发布的所有文章,最后按照发布时间降序排列。

图片

使用拉模型方案用户每打开一次「关注页」系统就需要读取 N 个人的文章(N 为用户关注的作者数), 因此拉模型也被称为读扩散。

拉模型不需要存储额外的数据,而且实现比较简单:发布文章时只需要写入一条 articles 记录,用户关注(或取消关注)也只需要增删一条 followings 记录。特别是当粉丝数特别多的头部作者发布内容时不需要进行特殊处理,等到读者进入关注页时再计算就行了。

拉模型的问题同样也非常明显,每次阅读「关注页」都需要进行大量读取和一次重新排序操作,若用户关注的人数比较多一次拉取的耗时会长到难以接受的地步。

推模型

另一部分工程师认为在创作者发布文章时就应该将新文章写入到粉丝的关注 Timeline,用户每次阅读只需要到自己的关注 Timeline 拉取就可以了:

图片

使用推模型方案创作者每次发布新文章系统就需要写入 M 条数据(M 为创作者的粉丝数),因此推模型也被称为写扩散。

推模型的好处在于拉取操作简单高效,但是缺点一样非常突出。

首先,在每篇文章要写入 M 条数据,在如此恐怖的放大倍率下关注 Timeline 的总体数据量将达到一个惊人数字。

而粉丝数有几十万甚至上百万的头部创作者每次发布文章时巨大的写入量都会导致服务器地震。

通常为了发布者的体验文章成功写入就向前端返回成功,然后通过消息队列异步地向粉丝的关注 Timeline 推送文章。

图片

其次,推模型的逻辑要复杂很多,不仅发布新文章时需要实现相关逻辑,新增关注或者取消关注时也要各自实现相应的逻辑,听上去就要加很多班。

在线推,离线拉

在做出最终决定之前我们先来对比一下推拉模型:

图片

虽然乍看上去拉模型优点多多,但是 Feed 流是一个极度读写不平衡的场景,读请求数比写请求数高两个数量级也不罕见,这使得拉模型消耗的 CPU 等资源反而更高。

此外推送可以慢慢进行,但是用户很难容忍打开页面时需要等待很长时间才能看到内容(很长:指等一秒钟就觉得卡)。

因此拉模型读取效率低下的缺点使得它的应用受到了极大限制。

我们回过头来看困扰推模型的这个问题「粉丝数多的时候会是灾难」,我们真的需要将文章推送给作者的每一位粉丝吗?

仔细想想这也没有必要,我们知道粉丝群体中活跃用户是有限的,我们完全可以只推送给活跃粉丝,不给那些已经几个月没有启动 App 的用户推送新文章。

至于不活跃的用户,在他们回归后使用拉模型重新构建一下关注 Timeline 就好了。

因为不活跃用户回归是一个频率很低的事件,我们有充足的计算资源使用拉模型进行计算。

图片

因为活跃用户和不活跃用户常常被叫做「在线用户」和「离线用户」,所以这种通过推拉结合处理头部作者发布内容的方式也被称为「在线推,离线拉」。

再优化一下存储

在前面的讨论中不管是「关注 Timeline」还是关注关系等数据我们都存储在了 MySQL 中。拉模型可以用 SQL 描述为:

SELECT *
FROM articles
WHERE author_uid IN (
 SELECT following_uid
 FROM followings
 WHERE uid = ?
)
ORDER BY create_time DESC
LIMIT 20;

通过查看执行计划我们发现,临时表去重+Filesort、这个查询叠了不少 debuff:

图片

至于推模型,关注 Timeline 巨大的数据量和读写负载就不是 MySQL 能扛得住的...

遇事不决上 Redis

显然关注 Timeline 的数据是可以通过 articles 和 followings 两张表中数据重建的,其存在只是为了提高读取操作的效率。这有没有让你想起另外一个东西?

没错!就是缓存。

关注 Timeline 实质上就是一个缓存,也就是说关注 Timeline 与缓存一样只需要暂时存储热门数据。

我们可以给关注 Timeline 存储设置过期时间,若用户一段时间没有打开 App 他的关注 Timeline 存储将被过期释放,在他回归之后通过拉模型重建即可。

在使用「在线推,离线拉」策略时我们需要判断用户是否在线,在为 Timeline 设置了过期时间后,Timeline 缓存是否存在本身即可以作为用户是否在线的标志。

就像很少有人翻看三天前的朋友圈一样,用户总是关心关注页中最新的内容,所以关注 Timeline 中也没有必要存储完整的数据只需要存储最近一段时间即可,旧数据等用户翻阅时再构建就行了。

鲁迅先生有句话说得好 ——「遇事不决上 Redis」,既然是缓存那么就是 Redis 的用武之地了。

Redis 中有序数据结构有列表 List 和有序集合 SortedSet 两种,对于关注 Timeline 这种需要按时间排列且禁止重复的场景当然闭着眼睛选 SortedSet。

将 article_id 作为有序集合的 member、发布时间戳作为 score, 关注 Timeline 以及个人 Timeline 都可以缓存起来。

在推送新 Feed 的时候只需要对目标 Timeline 的 SortedSet 进行 ZAdd 操作。若缓存中没有某个 Timeline 的数据就使用拉模型进行重建。

在使用消息队列进行推送时经常出现由于网络延迟等原因导致重复推送的情况,所幸 article_id 是唯一的,即使出现了重复推送 Timeline 中也不会出现重复内容。

这种重复操作不影响结果的特性有个高大上的名字,幂等性。

当 Redis 中没有某个 Timeline 的缓存时我们无法判断是缓存失效了,还是这个用户的 Timeline 本来就是空的。

我们只能通过读取 MySQL 中的数据才能进行判断,这就是经典的缓存穿透问题。

对于时间线这种集合式的还存在第二类缓存穿透问题,正如我们刚刚提到的 Redis 中通常只存储最近一段时间的 Timeline,当我们读完了 Redis 中的数据之后无法判断数据库中是否还有更旧的数据。

这两类问题的解决方案是一样的,我们可以在 SortedSet 中放一个 NoMore 的标志,表示数据库中没有更多数据了。

对于 Timeline 本来为空的用户来说,他们的 SortedSet 中只有一个 NoMore 标志:

图片

最后一点:拉取操作要注意保持原子性不要将重建了一半的 Timeline 暴露出去:

图片

总结一下使用 Redis 做关注时间线的要点:

  • 使用 SortedSet 结构存储,Member 为 FeedID,Score 为时间戳

  • 给缓存设置自动过期时间,不活跃用户的缓存会自动被清除。

  • 使用「在线推,离线拉」时只给 Timeline 缓存未失效的用户推送即可

  • 需要在缓存中放置标志来防止缓存击穿

一层缓存不够再来一层

虽然 Redis 可以方便的实现高性能的关注 Timeline 系统,但是内存空间总是十分珍贵的,我们常常没有足够的内存为活跃用户缓存关注 Timeline。

缓存不足是计算机领域的经典问题了,问问你的 CPU 它就会告诉你答案:一级缓存不够用就做二级缓存,L1、L2、L3 都用光了我才会用内存。

只要是支持有序结构的 NewSQL 数据库比如 Cassandra、HBase 都可以胜任 Redis 的二级缓存:

图片

附上一条 Cassandra 的表结构描述:

-- Cassandra 是一个 Map<PartionKey, SortedMap<ClusteringKey, OtherColumns>> 结构
-- 必须指定一个 PartionKey,顺序也只能按照 ClusteringKey 的顺序排列
-- 这里 PartionKey 是 uid, ClusteringKey 是 publish_time + article_id
-- publish_time 必须写在 ClusteringKey 第一列才能按照它进行排序
-- article_id 也写进 ClusteringKey 是为了防止 publish_time 出现重复
CREATE TABLE taojin.following_timelins (
    uid bigint,
    publish_time timestamp,
    article_id bigin,
    PRIMARY KEY (uid, publish_time, article_id) 
) WITH default_time_to_live = 60 * 24 * 60 * 60;

这里还是要提醒一下,每多一层缓存便要多考虑一层一致性问题,到底要不要做多级缓存需要仔细权衡。

还有一些细节要优化

分页器

Feed 流是一个动态的列表,列表内容会随着时间不断变化。

传统的 limit + offset 分页器会有一些问题:

图片

在 T1 时刻读取了第一页,T2时刻有人新发表了 article 11 ,如果这时来拉取第二页,会导致 article 6 在第一页和第二页都被返回了。

解决这个问题的方法是根据上一页最后一条 Feed 的 ID 来拉取下一页:

图片

使用 Feed ID 来分页需要先根据 ID 查找 Feed,然后再根据 Feed 的发布时间读取下一页,流程比较麻烦。

若作为分页游标的 Feed 被删除了,就更麻烦了。

笔者更倾向于使用时间戳来作为游标:

图片

使用时间戳不可避免的会出现两条 Feed 时间戳相同的问题, 这会让我们的分页器不知所措。

图片

这里有个小技巧是将 Feed id 作为 score 的小数部分,比如 article 11 在 2022-10-27 13:55:11 发布(时间戳 1666850112), 那么它的 score 为 1666850112.11 小数部分既不影响按时间排序又避免了重复。

图片

大规模推送

虽然我们已经将推送 Feed 的任务转移给了 MQ Worker 来处理,但面对将 Feed 推送给上百万粉丝这样庞大的任务, 单机的 Worker 还是很难处理。

而且一旦处理中途崩溃就需要全部重新开始。

我们可以将大型推送任务拆分成多个子任务,通过消息队列发送到多台 MQ Worker 上进行处理。

图片

因为负责拆分任务的 Dispatcher 只需要扫描粉丝列表负担和故障概率大大减轻。

若某个推送子任务失败 MQ 会自动进行重试,也无需我们担心。

总结

至此,我们完成了一个关注 Feed 流系统的设计。

总结一下本文我们都讨论了哪些内容:

  • 基本模型有两种。推模型:发布新 Feed 时推送到每个粉丝的 Timeline; 拉模型:打开 Timeline 时拉取所有关注的人发布的 Feed,重新聚合成粉丝的 Timeline。推模型读取快,但是推送慢,粉丝数多的时候峰值负载很重。拉模型没有峰值问题,但是读取很慢用户打开 Timeline 时要等待很久,读极多写极少的环境中消耗的计算资源更多。

  • 头部用户的几十上百万粉丝中活跃用户比例很少,所以我们可以只将他们的新 Feed 推送给活跃用户,不活跃用户等回归时再使用拉模型重建 Timeline.即通过「在线推、离线拉」的模式解决推模型的峰值问题。

  • 虽然关注 Timeline 数据很多但实际上是一种缓存,没必要全部存储。我们按照缓存的思路只存储活跃用户、最近一段时间的数据即可,没有缓存的数据在用户阅读时再通过拉模型重建。

  • Timeline 推荐使用 Redis 的 SortedSet 结构存储,Member 为 FeedID,Score 为时间戳。给缓存设置自动过期时间,不活跃用户的缓存会自动被清除。使用「在线推,离线拉」时只给 Timeline 缓存未失效的用户推送即可

  • 在 Redis 内存不足时可以使用 Cassandra 作为 Redis 的二级缓存。

你来解释一下feed流的含义 feed是将用户主动订阅的若干消息源组合在一起形成内容聚合器,帮助用户持续地获取最新的订阅源内容。 严格按照上述定义来说,我们通常说的搜索结果、排序列表都不能算作feed流。 feed流的展现形式有很多种,主要的有timeline以及rank。订阅源不再是某个内容,而是生产内容的人/团体。订阅中通常夹杂非订阅内容,比如热门推荐,广告。 内容也不再严格按照timeline,广泛使用智能feed排序。... 阅读详情

相关推荐

关于RS485通讯TVS器件选择的经验

先说经验结论 如果你的RS485用于频繁热拔插, 比如作为手持终端使用, 且手持器与目标板非隔离, 那么使用6.8CA可能是更好的选择.因为有热拔插会产生浪涌, 而且在非隔离的场合有些工业设备接地也是无法保障的.对于使用场景较为单一的, 点对点或点对多场合. 可以使用最大峰值脉冲电流较小的SM712.这是在长期的产品设计中得到的经验. 仅供参考 一. TVS的工作原理和作用 瞬态电压抑制二极管 ...

qq_20163075的博客 6510

如何打造千万级Feed流系统

在互联网领域,尤其现在的移动互联网时代,Feed流产品是非常常见的,比如我们每天都会用到的朋友圈,微博,就是一种非常典型的Feed流产品,还有图片分享网站Pinterest,花瓣网等又是另一种形式的Feed流产品。除此之外,很多App的都会有一个模块,要么叫动态,要么叫消息广场,这些也是Feed流产品,可以说,Feed流产品是遍布天下所有的App中。 概...

weixin_34315189的博客 789

北京绿盟科技安服实习生面经

记一次绿盟校招技术面经历,人生第一次面试,该说不说还是很紧张的,以下是技术面的一些问题,欢迎各位大佬在评论区补充纠正对于面试的问题,都应该自己下来深度去拓展学习,面试官问的问题刚好可以检测我们自己对某个模块的学习情况,借此更好的进行总结和学习。

qq_51690690的博客 3237

基础知识:什么是feed流?

Feed流 Feed是将用户主动订阅的若干消息源组合在一起形成内容聚合器,帮助用户持续地获取最新的订阅源内容。feed流即持续更新并呈现给用户内容的信息流。 总结一下:feed是将用户主动订阅的若干消息源组合在一起形成内容聚合器,帮助用户持续地获取最新的订阅源内容。严格按照上述定义来说,我们通常说的搜索结果、排序列表都不能算作feed流。     以下是维基百科中关于“web feed”...

tianyeshiye 6997

Hermes Agent Windows安装教程:本地智能体离线部署实战

本地智能体(Local Agent)是一种运行在用户设备端、无需云端依赖即可响应自然语言指令并自动化执行任务的轻量级AI运行时框架。其核心原理基于配置驱动的任务监听与脚本调用机制,通过服务化驻留实现持续响应能力,技术价值在于保障数据隐私、规避API调用限制、适配内网及老旧系统环境。典型应用场景包括财务报表自动整理、科研仪器数据归档、IT资产变更通知等Windows桌面自动化需求。本文聚焦Hermes Agent这一主流开源实现,围绕Windows平台特有的服务注册、权限模型、杀软拦截、中文路径与YAML编码

weixin_34411563的博客 433

用Java实现森林冰火人游戏

g.drawString("游戏结束", CELL_SIZE * COLS / 2 - 100, CELL_SIZE * ROWS / 2);g.drawString("难度级别: " + difficultyLevel, 10, CELL_SIZE * ROWS + 60);g.drawString("生命值: " + playerHealth, 10, CELL_SIZE * ROWS + 20);setTitle("森林冰火人");

2401_82778412的博客 1734

Feed流简介

LZ可能要去新的公司从事Feed流推荐相关的工作,在此之前,打算先对这一块内容做一个简单的介绍,也有利于我自身后续在这一方面的深耕。 在互联网领域,尤其现在的移动互联网时代,Feed流产品是非常常见的,比如我们每天都会用到的朋友圈,微博,就是一种非常典型的Feed流产品,还有图片分享网站Pinterest,花瓣网等又是另一种形式的Feed流产品。除此之外,很多App的都会有一个模块,要么叫动态,...

渣渣 9770

在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案

本文主要介绍了在claude code中使用glm模型出现Unable to connect to Anthropic services的解决方案,希望能对使用claude code的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 13万+

feed流和瀑布流_什么叫feed流?

从结构来看,很多社交和资讯类app中,都使用了feed流。例如:微信的朋友圈、今日头条的推荐页、知乎的关注页等,都是此形式。feed流是一个信息出口,想要与他人或资讯建立连接,只需要刷新这一个动作,即可获得大量所需,并且不断在更新,可谓杀时间好手,令人沉溺。想要设计好feed流页面,对feed流的概念,模式进行了解是十分必要的。什么是feed流呢?Feed,源自早期的RSS。是一种呈现内容给用户并...

weixin_39620197的博客 1125

智能 Agent 跨模态决策机制实战:多源数据融合与感知驱动行为策略设计

随着智能 Agent 应用从结构化文本处理拓展至图像识别、语音交互、传感器响应等多模态环境,其决策机制也面临从单模态语言理解向“多源感知驱动行为选择”的系统跃迁。本文聚焦跨模态输入下的 Agent 决策体系,系统性解析多源数据建模、感知融合方式、模态对齐机制、输入权重控制策略与策略引擎适配路径,进一步结合多模态提示构建、模态感知异常检测、模态优先级路由调度等工程问题进行实战拆解。通过企业级智能客服、制造车间控制、智慧医疗助手等典型案例,本文提供面向真实场景的跨模态 Agent 架构与多输入决策融合方案。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1353

DeepLabv3+改进68:全网首发-添加DBlock模块 |高效且鲁棒的多任务低光图像修复神经网络

本文提出了一种高效鲁棒的多任务低光图像修复神经网络DarkIR,针对夜间或昏暗条件下图像存在的噪点、光线不足和模糊问题。不同于现有方法分别处理去模糊和低光增强任务,该模型采用新的注意力机制增强CNN感受野,在降低计算成本的同时,在LOL-Blur、LOLv2和Real-LOLBlur数据集上取得最优结果,并能良好泛化到真实夜间图像。

AIcurator的博客 325

Easy-Vibe 系统设计方法论:从四步法到短链、Feed 流与秒杀系统的实战架构指南

系统设计不是拍脑袋画架构图,而是一套有章可循的方法论。本文以 Datawhale easy-vibe 项目 [系统设计方法论](https://link.gitcode.com/i/5de3456907ca9eb7880b09abc66619a6) 章节为骨架,系统讲解"需求澄清 → 容量估算 → 架构设计 → 深入优化"的四步法框架,并结合缓存、分库分表、消息队列等核心模式与短链服务、Feed

gitblog_01034的博客 973

Dify 第 19 篇 手把手教你开发 Dify 插件:从零实现一个时间工具

本文介绍了Dify平台的插件开发机制和流程。Dify支持多种插件类型,包括模型、工具、数据源等,可通过CLI工具快速开发插件。文章详细讲解了如何安装Dify CLI工具,并演示了从零开发一个获取系统时间插件的完整过程,包括项目初始化、文件解读和打包部署。通过该教程,开发者可以快速掌握Dify插件开发的核心要点,实现自定义功能扩展。

甘蓝的专栏 2449

黑马点评达人探店模块深度拆解:Redis ZSet与Feed流实战

在Java后端开发中,Redis是承载高并发场景的核心组件,而ZSet作为有序集合,既能存储唯一成员,又能基于score排序,天然适合实现Feed流、点赞排行榜等业务。理解ZSet的原理与使用边界,是构建社区类应用的关键技术价值。从内容生产到消费,从点赞互动到社交关系,合理的Redis数据结构设计能有效降低数据库压力,提升系统响应速度。在本地生活服务场景中,基于Redis ZSet的推模式Feed流,配合滚动分页解决动态数据分页错位问题,点赞缓存则通过ZSet记录用户集合,支持排行榜与状态查询。本文以黑马点

weixin_28691741的博客 199

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Feed流系统架构设计:推拉结合模式如何支撑10亿用户

在微博、抖音、知乎等内容平台中,Feed流是连接内容生产者与消费者的核心分发机制。面对海量用户、超高并发与读写比例悬殊的真实场景,架构师需要在写入与读取之间做出关键取舍。推模式通过写扇出缩短读取路径,却难以应对明星用户带来的写放大效应;拉模式以轻量写入规避扇出风暴,却让读路径承担沉重的聚合查询成本。理解两种模式的原理与代价,是设计高可用内容分发系统的基石。在实际工程中,成熟方案往往采用推拉结合模式,对普通用户推送内容至时间线缓存,对头部账号按需拉取,并借助消息队列、异步Fanout与Redis有序集合实现性

weixin_42579969的博客 176

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

黑马点评项目深度复盘:Redis高频考点与秒杀、缓存、Feed流实战解析

Redis作为高性能键值存储中间件,已成为高并发架构中解决缓存、分布式锁、消息队列等核心问题的关键技术。从基础的数据类型到分布式环境下的原子性保障,Redis在真实业务中承载着登录态管理、热点数据缓存、秒杀库存扣减、Feed流时间线以及地理位置检索等多样化场景。在实际工程中,开发者需要理解缓存穿透、击穿、雪崩的成因与应对策略,掌握分布式锁的演进与实现细节,并熟练运用Lua脚本保证复杂操作的原子性。本文以经典实战项目黑马点评为例,系统梳理短信验证码登录、商铺缓存、优惠券秒杀、关注Feed流和附近商铺GEO检索

weixin_29240343的博客 297

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

每周技术面试高频题汇总:大厂面试官到底在考什么?完整实战指南

大家好,又到了每周的面试复盘时间。。现在的面试官更喜欢把你扔进一个具体的“场景”里,看你怎么思考、怎么权衡(Trade-off)。基于过去一周 优快云、掘金、LeetCode 等社区的热议内容,我为大家精选了,涵盖算法、系统设计、数据库和网络四大领域。咱们不整那些虚的,直接上干货,看看这些题目背后的考察点和解题思路。

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 482

如何用mobile-system-design框架在30分钟内设计Twitter Feed

**mobile-system-design框架**是一个专门为移动端系统设计面试打造的简单工具,它能帮助你在有限时间内展示清晰的设计思路和架构能力。无论你是iOS还是Android开发者,这个框架都能让你在系统设计面试中脱颖而出,从容应对各种复杂场景。 ## 🎯 框架核心优势 **mobile-system-design框架**最大的价值在于它提供了一个结构化的思考流程,让你能够系统性地分

gitblog_00369的博客 778

关注流系统设计:推拉结合模式解决大V发视频的写放大难题

Feed流是社交产品核心功能,关注流则强调时间序与社交关系。在设计高并发关注流时,常见推模式会因头部大V的海量粉丝产生严重写放大,导致Redis集群压力过大。本文基于推拉结合混合模式,介绍如何通过生产者分层、Redis ZSET收件箱/发件箱、异步消息队列等手段平衡读写开销。该方案适用于抖音、微博、Instagram等亿级用户场景,能有效控制热点账号发布时的推送风暴。围绕缓存设计、游标分页、数据一致性等细节展开,帮助工程实践者与面试准备者系统理解Feed流架构权衡。

weixin_34098209的博客 321

关注流设计:顶流1亿粉丝的Redis写放大问题与推拉结合架构

在内容平台与社交系统中,关注流(Feed流)是高并发架构设计的核心场景之一。当用户关注大量作者后,如何高效聚合内容并按时间倒序展示,通常需要权衡“推模式”与“拉模式”两种策略:推模式在写入时扇出,读路径轻快,但面对顶流大V的亿级粉丝会产生严重的写放大问题,一次发布即触发上亿次Redis写入,导致数据不一致与资源瓶颈;拉模式则把压力转移到读路径,每次刷新需合并大量关注列表,延迟高且实时性差。工业级方案多采用推拉结合的分级架构,对普通作者使用推模式、对超大V走拉取合并,并借助Redis ZSet存储时间线、游标

weixin_30768881的博客 300

大厂Java面试复盘:高并发、AI服务与微服务架构实战

在Java后端开发中,高并发场景下的架构设计一直是衡量工程师能力的核心标尺。面对内容社区、电商推荐等业务,微服务架构通过服务拆分与消息队列实现应用解耦,而分布式事务则保证了跨服务的数据一致性——从本地消息表到Seata,不同方案有着截然不同的性能取舍。随着大模型技术的落地,AI服务不再是独立实验,而是需要与现有微服务深度集成:RAG、向量检索、prompt工程与模型降级策略,为业务赋予了新的智能化能力。理解这些技术的原理与适用边界,不仅能帮助开发者构建高可用的生产系统,更能在大厂面试中精准展现实战深度。从内

weixin_32864847的博客 317

用音视频内容社区场景拿下 Java 面试:Spring Boot + 微服务 + Kafka + Redis + RAG 全流程实战

本文通过一个互联网大厂Java面试故事,围绕音视频与内容社区场景,分三轮对求职者进行循序渐进的技术提问,涵盖Spring Boot、微服务、消息队列、缓存、数据库与ORM、监控日志、AI RAG 等技术点,并在文末给出详细标准答案,帮助零基础也能理解业务场景与技术选型。

qq_57418183的博客 484

面试官:“聊聊你最复杂的项目?” 为什么90%的候选人第一句就栽了?

最终,我在面试记录里写下:“技术视野尚可,但缺乏深度,理解较为表面,建议不予通过。说白了,不是你的能力不行,而是你没有把“做了什么”和“做成了什么”有效传递出去,导致面试官觉得你只是个执行者,而不是能推动问题的解决者。你陈述的是现象,他捕捉的是背后的能力信号。有天晚上,我连续面试了两位工作经历均为三年的工程师,问了他们同一个问题:“请谈谈你做过最复杂的项目,或者你认为最有价值的项目。(点评:不仅要讲“用了什么”,更要讲“为什么选它”“怎么实现的”“遇到什么风险如何规避”,体现实战中的技术判断力和架构思维。

2501_93078354的博客 404

阿里后端实习面试:从八股文到系统设计的深度工程实践

在软件工程领域,面试不仅是知识点的考察,更是对候选人工程实践能力的综合评估。其核心原理在于,真实业务场景中的问题往往需要结合基础理论、系统设计和技术选型来综合解决。从技术价值角度看,深入理解如JVM内存模型、MySQL索引优化、分布式缓存等核心概念,能够帮助开发者构建高性能、高可用的系统。这些技术广泛应用于电商、社交、金融等高并发场景,例如在优化商品详情页接口或设计Feed流系统时,需要综合考虑缓存策略、数据库索引、消息队列等技术选型与协作。本文以阿里实习面试为例,探讨如何超越单纯的八股文背诵,通过构建技术

weixin_33976072的博客 340

系统设计模拟面试:从需求澄清到架构落地的完整指南

系统设计是后端工程师从编码走向架构的关键能力,其核心在于面对开放式问题时如何快速完成需求澄清、容量估算、模块拆分与扩展性设计。在工程实践中,无论是短链接、Feed流还是秒杀系统,都遵循同一套分析框架:先量化规模,再选型组件,最后通过数据模型与接口定义落地。容量估算作为其中最具量化说服力的环节,直接决定存储、带宽与缓存策略是否合理。系统设计模拟面试正是将这套能力转化为可表达输出训练场,通过限时演练、录音回放与追问复盘,帮助候选人适应40-60分钟的高强度表达节奏,同时反哺日常架构评审与技术方案撰写。掌握这些方

weixin_33888907的博客 324

人人网2015研发笔试题D卷复盘:算法基础与系统设计

在互联网研发岗位的笔试与面试中,算法基础与系统设计始终是核心考察点。字符串循环移位、海量数据TopK等问题看似简单,却隐藏着KMP、哈希分桶与最小堆等经典原理;TCP的TIME_WAIT、InnoDB的B+树索引等基础知识,则直接对应高并发服务与数据库优化的真实工程场景。理解这些概念的技术价值,能帮助候选人快速定位考查意图,并在Feed流、缓存设计等业务系统中做到方案取舍。人人网2015年研发笔试题D卷正是这样一份兼具广度和深度的样本,本文基于亲历经验完整复盘每类题型,拆解解题思路与易错点,适合正在准备社交

weixin_30565199的博客 425
上一篇: ChatGPT4o被越狱了,有人拿来搞大尺度!
下一篇: “现在,仅需两行代码,就能窃取你在 Windows PC 上输入/查看的所有内容!”
IT界那些事儿
博客等级 码龄6年 2万+粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值