当前位置: 首页 > article >正文

【Feed 高并发架构实战】:雪花 ID + 三级缓存 + 计数旁路设计详解

你好我是fengxin_rou这是我的个人主页fengxin_rou的主页❄️欢迎查看我的专栏我的专栏《Java后端学习》、《JAVASE基础》、《JUC并发》、《redis》、《JVM虚拟机》、《MYSQL》、《黑马点评》、《rabbitmq》、《JavaWebAI的talis学习系统》、《苍穹外卖》目录前言一、雪花算法 ID 生成器分布式唯一 ID 设计与实现1.1 ID 结构设计1.2 核心代码实现1.3 关键特性二、Feed 流三级缓存架构高并发读性能优化2.1 缓存层级定义2.2 缓存读取流程2.3 hasMore 软缓存设计2.4 核心优势三、计数旁路更新与反向索引实时计数精准失效3.1 核心设计思路3.2 计数监听核心代码3.3 反向索引与清理机制四、工程化实践要点与架构价值4.1 关键实践原则4.2 架构整体价值结语前言在高并发内容平台中分布式 ID 生成、多级缓存架构、实时计数更新是支撑海量请求的核心技术。本文基于知文业务实战深度解析雪花算法 ID 生成器、Feed 流三级缓存设计、计数旁路更新与反向索引精准失效方案覆盖原理、代码实现与工程化实践可直接用于分布式内容系统架构设计。补充可以观看我前一篇feed文Feed 三级缓存架构详解分层设计、缓存一致性与高性能实战一、雪花算法 ID 生成器分布式唯一 ID 设计与实现在分布式系统中数据库自增 ID 存在性能瓶颈、易暴露业务量、不支持多机房等缺陷雪花算法通过内存生成 ID单机 TPS 可达千万级完美解决上述问题。1.1 ID 结构设计雪花 ID 为64 位长整型结构固定1 位符号位固定为 0保证 ID 为正数41 位时间戳相对自定义纪元支持约 69 年5 位数据中心 ID支持 32 个机房5 位工作节点 ID单机房支持 32 台服务器12 位序列号单毫秒支持 4096 个 ID1.2 核心代码实现Component public class SnowflakeIdGenerator { // 自定义纪元2024-01-01 00:00:00 UTC private static final long EPOCH 1704067200000L; // 各部分位数定义 private static final long WORKER_ID_BITS 5L; private static final long DATACENTER_ID_BITS 5L; private static final long SEQUENCE_BITS 12L; // 最大值计算 private static final long MAX_WORKER_ID ~(-1L WORKER_ID_BITS); private static final long MAX_DATACENTER_ID ~(-1L DATACENTER_ID_BITS); // 位移偏移量 private static final long WORKER_ID_SHIFT SEQUENCE_BITS; private static final long DATACENTER_ID_SHIFT SEQUENCE_BITS WORKER_ID_BITS; private static final long TIMESTAMP_LEFT_SHIFT SEQUENCE_BITS WORKER_ID_BITS DATACENTER_ID_BITS; private static final long SEQUENCE_MASK ~(-1L SEQUENCE_BITS); private final long datacenterId; private final long workerId; private long lastTimestamp -1L; private long sequence 0L; // 构造器与参数校验 public SnowflakeIdGenerator(long datacenterId, long workerId) { if (workerId MAX_WORKER_ID || workerId 0) { throw new IllegalArgumentException(workerId越界); } if (datacenterId MAX_DATACENTER_ID || datacenterId 0) { throw new IllegalArgumentException(datacenterId越界); } this.datacenterId datacenterId; this.workerId workerId; } // 线程安全生成ID public synchronized long nextId() { long timestamp System.currentTimeMillis(); // 时钟回拨处理 if (timestamp lastTimestamp) { long offset lastTimestamp - timestamp; if (offset 5) { // 小幅度回拨等待时钟追回 try { Thread.sleep(offset); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new IllegalStateException(线程中断); } timestamp System.currentTimeMillis(); if (timestamp lastTimestamp) { throw new IllegalStateException(时钟仍回拨); } } else { // 大幅度回拨拒绝生成 throw new IllegalStateException(时钟回拨过大); } } // 序列号自增 if (lastTimestamp timestamp) { sequence (sequence 1) SEQUENCE_MASK; if (sequence 0) { timestamp waitNextMillis(lastTimestamp); } } else { sequence 0L; } lastTimestamp timestamp; // 组装ID return ((timestamp - EPOCH) TIMESTAMP_LEFT_SHIFT) | (datacenterId DATACENTER_ID_SHIFT) | (workerId WORKER_ID_SHIFT) | sequence; } private long waitNextMillis(long lastTimestamp) { long timestamp System.currentTimeMillis(); while (timestamp lastTimestamp) { timestamp System.currentTimeMillis(); } return timestamp; } }1.3 关键特性线程安全nextId () 加 synchronized保证并发安全时钟回拨防护≤5ms 等待追回5ms 直接抛异常避免 ID 重复高并发单毫秒支持 4096 个 ID内存计算无 IO 开销二、Feed 流三级缓存架构高并发读性能优化知文 Feed 采用L1 本地缓存 L2 Redis 分片缓存 L3 数据库三级架构解决高并发下缓存击穿、命中率低、更新不及时问题。2.1 缓存层级定义L1 Caffeine 缓存本地内存存储整页 Feed 数据访问速度 0.001msL2 Redis 分片缓存存储文章 ID 列表、单篇文章详情、hasMore 标记支持批量读取L3 MySQL 数据库数据源头仅缓存未命中时查询2.2 缓存读取流程请求进入优先查询 L1命中直接返回L1 未命中查询 L2数据完整则组装并回填 L1L2 数据不完整触发 L3 查询全量覆盖 L2 后回填 L1前端展示并结束流程2.3 hasMore 软缓存设计hasMore 标记是否有下一页采用软缓存 兜底逻辑优先使用缓存中的 hasMore 值缓存缺失时按当前页数量页大小判断兜底不影响最终准确性下一页请求会修正为真实值2.4 核心优势防缓存击穿单航班锁保证同一页只查一次数据库高命中率L1L2 组合命中率可达 99%状态分离用户态与公共态分离避免缓存污染三、计数旁路更新与反向索引实时计数精准失效点赞、收藏等计数变化需不侵入主流程、精准更新所有相关缓存采用计数旁路 反向索引方案实现。3.1 核心设计思路旁路更新计数变更通过事件异步触发不阻塞主接口反向索引记录文章 ID→被哪些 Feed 页引用实现精准失效双缓存更新同步更新 L1 本地缓存与 L2 Redis 缓存3.2 计数监听核心代码EventListener public void onCounterChanged(CounterEvent event) { // 只处理知文点赞/收藏事件 if (!knowpost.equals(event.getEntityType())) return; String metric event.getMetric(); if (!like.equals(metric) !fav.equals(metric)) return; String eid event.getEntityId(); int delta event.getDelta(); // 更新创作者总计数 try { KnowPost post knowPostMapper.findById(Long.valueOf(eid)); if (post ! null post.getCreatorId() ! null) { long owner post.getCreatorId(); if (like.equals(metric)) { userCounterService.incrementLikesReceived(owner, delta); } if (fav.equals(metric)) { userCounterService.incrementFavsReceived(owner, delta); } } } catch (Exception ignored) {} // 获取最近两小时反向索引 long hourSlot System.currentTimeMillis() / 3600000L; SetString keys new LinkedHashSet(); SetString cur redis.opsForSet().members(feed:public:index: eid : hourSlot); SetString prev redis.opsForSet().members(feed:public:index: eid : (hourSlot - 1)); if (cur ! null) keys.addAll(cur); if (prev ! null) keys.addAll(prev); // 遍历更新缓存 for (String key : keys) { // 更新L1本地缓存 FeedPageResponse local feedPublicCache.getIfPresent(key); if (local ! null) { FeedPageResponse updated adjustPageCounts(local, eid, metric, delta, true); feedPublicCache.put(key, updated); } // 更新L2 Redis缓存 String cached redis.opsForValue().get(key); if (cached ! null) { try { FeedPageResponse resp objectMapper.readValue(cached, FeedPageResponse.class); FeedPageResponse updated adjustPageCounts(resp, eid, metric, delta, false); writePageJsonKeepingTtl(key, updated); } catch (Exception ignored) {} } else { // 清理失效索引 redis.opsForSet().remove(feed:public:index: eid : hourSlot, key); } } }3.3 反向索引与清理机制正向索引页面 Key→包含的文章 ID反向索引文章 ID→被哪些页面引用自动清理缓存过期时监听器自动移除无效索引避免内存浪费四、工程化实践要点与架构价值4.1 关键实践原则参数安全化接口参数校验防止恶意请求防御性编程空值判断、异常捕获保证系统健壮状态隔离用户态不写入公共缓存避免数据污染软缓存兜底关键标记用软缓存 逻辑兜底提升可用性4.2 架构整体价值性能提升接口响应从百毫秒降至毫秒级高可用缓存 数据库降级支持流量洪峰易扩展支持多机房、多节点水平扩容低耦合计数、缓存、业务逻辑分离便于维护结语本文完整呈现知文 Feed 高并发架构的三大核心雪花 ID 保证分布式唯一、三级缓存支撑高并发读、反向索引 旁路更新实现实时计数。整套方案兼顾性能、可靠性与可扩展性适用于内容 Feed、社交动态、商品流等高并发场景。实际落地中可根据业务调整节点位数、缓存过期时间、回拨容忍阈值进一步优化架构适配性。

相关文章:

【Feed 高并发架构实战】:雪花 ID + 三级缓存 + 计数旁路设计详解

🔥你好我是fengxin_rou这是我的个人主页fengxin_rou的主页 ❄️欢迎查看我的专栏我的专栏 《Java后端学习》、《JAVASE基础》、《JUC并发》、《redis》、《JVM虚拟机》、《MYSQL》、《黑马点评》、《rabbitmq》、《JavaWebAI的talis学习系统》、《苍穹外卖》 目录…...

S200驱动器报A1489故障

安全配置未受保护A01637报警处理方法(西门子S200驱动器UMAC详细配置) https://rxxw-control.blog.csdn.net/article/details/157173145?spm=1011.2415.3001.5331https://rxxw-control.blog.csdn.net/article/details/157173145?spm=1011.2415.3001.5331 1、连接驱动器...

运算符的种类以及基本用法

一、算术运算符(最基础) 运算符名称示例说明加法358正数 / 加法运算-减法 / 负号5-32减法或表示负数(如 -5)*乘法3*515注意:不是 ,是 */除法5/22整数除法舍去小数,5.0/22.5%取模(取…...

Windows提权(一)———系统内核溢出漏洞提权

声明 本博客内容仅供技术学习与安全研究之用,严禁用于任何非法或未授权的活动。转载需注明出处。因不当使用导致的后果,作者不承担责任。 溢出漏洞是一种计算机程序的可更正性缺陷。溢出漏洞的全名:缓冲区溢出漏洞。因为它是在程序执行的时候…...

API 的分布式世界 vs COM 的语言桥梁:典型应用场景深度解析

典型应用场景:API:构建现代分布式系统,如微服务、Web应用、移动后端、IoT设备通信;COM:使不同语言编写的软件组件(如C组件被C#、Python调用)在Windows上协同工作。对 API 和 COM 的典型应用场景…...

dumpsys netstats detail 输出解释netd的app的网络流量统计

dumpsys netstats detail 输出解释 重启后,数据会清零,从新统计 UID tag stats: Pending bytes: 27977 History since boot: ident[{type9, ratTypeCOMBINED, meteredtrue, defaultNetworktrue, oemManagedOEM_NONE, subId-1}] uid1000 setDEFAULT tag0x…...

回归分析((>^ω^<)喵)

回归分析找到2个数据以上的的关系做预测的。是预测数字形的而不是男还是女这种问题1.举例略说这是一张图,是学习时间与成绩的回归分析,这条红线是回归线Xx是自变量,是用于预测的,例如学习时间,是因Yy是因变量 &#xf…...

高等数学 定理及习题

本文涉及知识点 数学 《高等数学》(上册) 第一章 函数与极限 第一节 映射与函数 第二节 数列的极限 第三节 函数的极限 第四节 无穷小与无穷大 第五节 极限运算法则 第六节 极限存在准则 两个重要极限 第七节 无穷小的比较 第八节 函数的连续性…...

2026 国内 ChatGPT 镜像站推荐

📖 国内直接访问,支持 GPTs、绘图、文件分析,对话数据隔离 ✅ 写方案/周报,描述需求直接生成,5分钟搞定 ✅ 代码报错,粘贴进去秒出解决方案 ✅ 读文件/PDF,上传即可提问,不用逐字看…...

C251编译器变量分配与内存空间解析

1. C251编译器变量分配问题解析最近在Keil C251开发环境中遇到一个有趣的现象:编译器似乎将部分变量分配到了特殊功能寄存器(SFR)的内存空间。查看链接器生成的MAP文件时,发现如下信息:0000DDH 0000EAH 00000EH BYTE UNIT EDATA …...

Perforce 2025.2 REST API 技术预览版发布:开启“无客户端”运维新时代

Perforce 2025.2 REST API 技术预览版发布:开启“无客户端”运维新时代 在上一期“ Perforce on Tour 游戏研发效能进阶沙龙”回顾文章中,我们分享了Perforce 资深技术工程师 Kory Luo关于P4 MCP(Model Context Protocol)服务器的…...

OpsKat v1.3.0 - SSH、数据库集中管理工具

平时操作服务器环境,经常要打开好几个工具来回切换,想着能不能直接跟 AI 说一句话就搞定,于是做了 OpsKat ,就算你不使用 AI 功能,常用的资产操作都集成在一起,也不用再在好几个工具之间跳了。举几个实际使…...

2026年数据驱动经济与信息管理国际学术会议(DDEMI 2026)

2026年数据驱动经济与信息管理国际学术会议(DDEMI 2026)会议时间:2026年8月07日-09日会议地点:江苏-南京截稿日期:2026年7月31日录用结果:投稿后1周内收录检索:EI Compendex, Scopus【大会简介】…...

图片批量识别提取信息

图片批量识别提取信息工具,是用aardio写的,调用微信OCR识别图片中的信息,识别正确率非常高,用于提取各类证件和文档,对于在基层村、社区工作的人员是很有帮助的。 喜欢的朋友可以下载试用。分享了「图批量识别提取信息…...

stm32f4 + Helix + Max98357播放mp3文件

stm32f4的SDIO + FataFs读取SD卡文件在前面的文章中已经实现,下面的配置和修改基于之前的配置实现 配置I2S 模式设置 参数设置 DMA配置 勾选 SPI2 global interrupt 以上都配置完Helix 解码出来的 PCM 数据就发给 MAX98357了 Helix解码库移植...

职业会崩塌,岗位会消失,聪明的技术人该何去何从?

凌晨两点,写字楼的灯还亮着。我盯着屏幕上第 37 次运行的测试用例,咖啡杯里沉淀着今天的第三份浓缩。突然弹出一条消息:“系统架构升级,你的岗位可能被优化”。那一刻,我忽然意识到:我精心打磨的"职业…...

国产信创ARM架构系统的备份与还原

ARM架构系统的备份与还原这里以【银河麒麟桌面系统】为例进行演示操作,其余的ARM架构的服务器或桌面 操作系统进行备份与还原都是一样的步骤,详细操作如下所示: 2.1、使用再生龙通过ssh方式克隆备份系统(推荐) 2.1.1…...

SAP LeanIX: 从“手工台账”到“EA中枢“

在上一篇文章中,我们跟着PumpTech走完了一整圈——从体检、找堵点、数据验证,到画目标蓝图、排路线图。最后我们提炼了一套“五步法”和一个“三维评估矩阵”,算是把EA方法论从书本拽到了地上。 但故事讲完后,有一个问题始终悬而…...

兄弟反目成仇?《易经》深挖人性:猜疑才是最大祸根

你有没有过这样的经历?关系最好的朋友或同事,因为一个误会,突然就成了“最熟悉的陌生人”。你解释,他觉得你掩饰;你沉默,他觉得你默认。最后,好好的关系,硬生生被“猜疑”这把刀&…...

【NotebookLM效应量计算实战指南】:20年统计学专家亲授3大避坑法则与5步精准计算流程

更多请点击: https://kaifayun.com 第一章:NotebookLM效应量计算的核心概念与适用场景 NotebookLM 是 Google 推出的基于用户上传文档进行语义理解与推理的实验性 AI 工具。其“效应量计算”并非内置统计模块,而是指用户在利用 NotebookLM 对…...

数据库局部变量,全局变量,流程控制

前言知识点什么时候用?局部变量调试脚本、存储过程参数、临时存值全局变量获取执行状态、错误处理IF/WHILE条件判断、批量数据处理视图简化复杂查询、统一查询逻辑索引加快查询速度函数封装可复用的计算逻辑存储过程封装复杂业务、批量操作一SQL局部变量变量1.是什么…...

ElevenLabs广西话输出突然失真?一文定位3类隐藏错误:声母浊化丢失、入声韵尾截断、连读变调失效

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs广西话语音输出失真现象概览 ElevenLabs 作为当前主流的AI语音合成平台,其多语言支持能力广受开发者青睐。然而,在针对广西话(粤语勾漏片与邕浔片混合变体…...

H3CSE 高性能园区网:生成树保护机制

H3CSE 高性能园区网:生成树保护机制一、生成树保护机制1. BPDU保护1.1 边缘端口特点及问题端口基础特性存在的安全隐患1.2 BPDU保护机制核心防护逻辑机制运行优势1.3 BPDU保护配置配置使用规范H3C设备配置命令2. 根桥保护2.1 根桥保护机制2.2 根桥保护配置要求2.3 根…...

在内容生成流水线中集成多模型 API 以提升创作多样性

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在内容生成流水线中集成多模型 API 以提升创作多样性 对于新媒体运营、营销或内容创作团队而言,保持内容的新鲜感与多样…...

opencode使用安装

确保已经安装好node npm安装opencode C:\WINDOWS\system32>npm install -g opencode-aiadded 3 packages in 2mC:\WINDOWS\system32>npm安装mcp-chrome C:\WINDOWS\system32>npm...

网络设备a

顺序1.聚合 2.vlan 3.MSTP 4.VRRP 5.路由先配置聚合lsw2 lsw1内同配置vlan 10 20,配置好后对所有接口放通vlan放通的其一进行MSTP配置lsw1作为instance 1的根桥 instance 2的备份根桥lsw2作为instance 2的根桥 instance 1的备份根桥再配置VRRP之后进行osp…...

本地部署 Open Claw 保姆教程,同事还在手动整理文件,我已经让 AI 全搞定了

前言 2026 年开源圈热门的「数字员工」OpenClaw(昵称小龙虾),GitHub 星标超 28 万,凭「本地运行 零代码操作 自动干活」的优势圈粉无数!很多人误以为它是普通聊天 AI,实则是能真正操控电脑的自动化神器 …...

CANN-Ascend-C存储体系-昇腾NPU的四级缓存怎么用才算对

写 Ascend C 算子,最常犯的错误不是计算写错,是数据搬运写错。昇腾NPU有四级存储,每一级的容量、带宽、延迟都不同。数据该放在哪一级、什么时候搬、搬多少,直接决定算子性能。 四级存储级别名称容量带宽延迟用途L0HBM&#xff08…...

Day03 Web应用OSS存储负载均衡CDN加速反向代理WAF防护部署影响

我的博客园笔记 一、WebWAF WAF(Web应用防火墙):是一种专门设计用于保护 Web 应用程序免受恶意攻击的安全设备,它能够实时监控、过滤和拦截可能对网站造成危害的网络流量,从而避免网站服务器被恶意入侵,导…...

Python之anonymate包语法、参数和实际应用案例

一、AnonyMate 包概述 AnonyMate是 Python 第三方数据匿名化工具包,版本 0.1.5,专注结构化/非结构化数据脱敏、假名化、加密与合成数据生成,适配医疗、金融、电商等敏感数据场景,助力合规(GDPR、等保2.0)。…...