IT技术博客大学习 共学习 共进步

系统架构

共 731 篇文章

IT 2014-11-30 23:13:54 / 累计浏览 4,592

手机应用/服务器开发的一些总结(一)

这篇讲的是作者在Android客户端与服务器端开发中的一些实战积累,尤其聚焦于“用户数据存储”和“通信协议选择”这两个常见却关键的问题。 在通信协议部分,作者基于亲身体验,对比了四种常见方案。HTTP最简单但难以应对实时需求,尤其在移动网络下可能出现异常;WebSocket体验良好,能与现有HTTP服务器无缝结合;SocketIO虽然封装周全,但作者认为其过度兼容并不必要,且Python服务端在处理客户端断开连接时行为不符合预期;而原生Socket自定义协议灵活性最高,但开发难度也相应增大。 关于用户数据存储,作者以Django Model为例,展示了基础用户表的设计,并特别分享了一个处理联合登录(如Facebook)的技巧:不破坏原有User表结构,而是新建关联表。他建议谨慎使用外键,为未来可能的数据迁移或拆分留出余地。 作为系列文章的开篇,这篇总结没有泛泛而谈,而是通过具体的代码片段和协议优劣分析,为开发者提供了在项目初期做技术选型时的切实参考。

IT 2014-11-28 23:31:06 / 累计浏览 3,113

通过FastCGI Cache实现服务降级

这篇讲的是如何在去掉CDN的PHP网站里,通过FastCGI Cache巧妙实现服务降级。背景是项目新增实时需求后架构稳定性下降,但完全重构不现实,因此需要一种尽可能透明的降级方案。 核心思路是在Nginx层利用FastCGI Cache和error_page指令。正常流量时缓存被穿透,保持实时性;一旦后端返回500/502等错误,便通过重写触发降级逻辑,从缓存中提供陈旧内容,从而实现“断尾求生”。文章给出了可直接使用的通用版Nginx配置。 更进一步,作者通过Lua脚本和共享字典实现了“定制版”:能自动统计单位时间内的错误次数,一旦超过阈值(如每分钟1000次),便全局自动激活缓存,无需人工干预。这种从“被动响应错误”到“主动判断系统健康并自动降级”的演进,是方案的亮点所在。

IT 2014-11-28 23:28:08 / 累计浏览 1,634

HBase在单Column和多Column情况下批量Put的性能对比分析

这篇讲的是HBase在不同数据模型下批量写入的性能差异。作者从一个实际现象出发:将数据存储在单个列(单列模式)与拆分成多个列(多列模式)时,批量Put的吞吐量存在巨大差距。测试数据显示,单列模式的TPS是多列模式的7倍以上,RPC调用次数也相差9倍。 文章核心是从HBase的KeyValue内存模型入手,解释了这种差距的根本原因。在多列模式下,每一列都会携带大约50-60字节的元数据开销(如行键、列族、时间戳等),导致一行数据在客户端缓冲区中占用的内存远大于单列模式,进而触发更频繁的RPC提交,拉低了整体吞吐。 作者通过代码计算put.heapSize()和KeyValue对象大小,验证了这一理论估算与测试结果高度吻合。文章最终给出实用建议:如果业务模型必须使用多列存储,在批量写入场景下,可以考虑适当调大客户端的write buffer,以缓解性能下降。

IT 2014-11-28 22:13:57 / 累计浏览 2,876

分布式全文检索系统SolrCloud简介

这篇文章讲解的是面向大规模搜索场景的分布式方案——SolrCloud。作者从Solr的部署演进讲起,指出单机和传统Master-Slaver方式的局限性,而SolrCloud基于Zookeeper实现了真正的分布式协同。 摘要重点突出了它的核心特性:集中式配置管理,让集群配置变更全局生效;自动容错与分片,单个节点故障不影响服务,并能自动重建副本;近实时搜索支持秒级数据可检索;查询时自动负载均衡,可通过横向扩展缓解压力。文章也提到了索引存储于HDFS、通过MapReduce批量建索引等高阶能力,以及强大的RESTful API和管理界面。 最后,文章对Collection、Shard、Replica等核心概念进行了阐释,帮助读者建立清晰模型。整体来看,这是一篇对SolrCloud分布式架构、关键技术点和适用场景的扎实入门介绍。

IT 2014-11-27 12:56:39 / 累计浏览 3,108

构建高可用和弹性伸缩的KV存储系统

KV存储系统在现代高并发应用中扮演着关键角色,但经典的Memcached和Redis在运维中常面临容灾困难、数据复制效率低以及在线扩容复杂等挑战。这篇内容从这些实际痛点出发,深入分析了Redis在持久化、主从复制和集群扩展方面的局限,比如主机宕机可能导致数据丢失、全量复制影响性能,以及扩容需要人工干预等。 针对这些问题,文章提出了一套新的分布式架构设计。该系统由路由、存储、管理和搬迁四类节点组成,通过一致性哈希与虚拟节点实现数据均匀分布,并利用心跳检测和自动切换机制来保障高可用。新方案不仅兼容现有协议,还实现了自动容错恢复、负载均衡和弹性伸缩,试图在保证内存级性能的同时,让运维变得更加智能和可靠。 整体来看,这不仅是对现有技术的梳理,更提供了一个从架构层面系统化解决KV存储可用性与扩展性难题的思路,对从事基础架构或缓存设计的工程师有直接的参考价值。

IT 2014-11-25 23:04:58 / 累计浏览 1,996

浏览器图片渲染优化

页面加载时内容会“跳动”,这篇技术博客解释了其中一个常见原因:图片尺寸未被提前声明。文章指出,浏览器需要下载并解析图片才能确定其尺寸,这个过程会导致反复的布局计算和重绘,严重影响渲染效率。 核心解决方案其实很简单:为所有 标签显式指定 width 和 height 属性。这样浏览器能在下载图片前就为其预留出空间,从而消除不必要的回流(reflow),让页面渲染更流畅。文章详细对比了指定尺寸与不指定尺寸的区别:前者能让浏览器在下载图片前就渲染页面,消除布局偏移;后者则会导致浏览器反复计算布局,拖慢速度。 作者也提到了使用该属性可能带来的小问题——禁用图片时可能出现空框,但整体上仍强烈推荐使用,因为性能提升的收益远大于此。此外,文章给出了两个关键实践建议:一是不要用 HTML 或 CSS 强行缩放图片(比如把 60x60 的图强制显示为 30x30),应该在图像处理软件中预先调整好尺寸;二是建议为图片本身或其直接父容器指定尺寸,这样才能有效生效。 尽管存在显示上的小权衡,但养成在代码中为图片预定义尺寸的习惯,是前端性能优化中一项非常值得投入的基础工作。

IT 2014-11-25 22:47:00 / 累计浏览 3,190

每个程序员都应该知道的一些访问时延值

这篇文章分享了一组程序员最好烂熟于心的参考值——从CPU各级缓存、主存、固态硬盘到跨地域网络请求的访问延迟。这组经典数据最早源自谷歌传奇工程师 Jeff Dean 的演示文稿,它用具体数字将抽象的“快”与“慢”量化成了直观的层次。 例如,从L1缓存访问只需几纳秒,而访问一次固态硬盘则需要几万纳秒,一次跨大西洋的网络往返可能要一百多万纳秒。这之间几个数量级的差异,直接决定了我们在设计算法、选择存储方案和搭建分布式系统时的性能天平该如何倾斜。文章作者不仅呈现了数据,还提供了社区整理的精炼版链接,并讲述了关于 Jeff Dean 的著名轶事,让这组数据多了几分传奇色彩。 在编程世界里,凭感觉优化往往事倍功半。而将这些延迟数字内化于心,能帮助你在架构层面做出更明智的判断,比如何时该引入缓存、数据该如何分区、或是如何设计一个能容忍网络延迟的服务。有了这些量化概念,做技术决策时才能心中有“数”。

IT 2014-11-23 21:44:44 / 累计浏览 7,316

分布式系统的事务处理

这篇文章从单服务器的性能瓶颈和单点故障问题出发,探讨了分布式系统为提升可用性而采用数据分区或数据镜像后,如何处理跨服务器事务这一核心难题。 作者以经典的“转账”场景为例,清晰地阐述了数据冗余带来的双刃剑效应:高可用性必然导致数据一致性挑战,而保证一致性又可能牺牲性能。文章并未给出单一解法,而是梳理了业界应对这一问题的几种关键思路。首先介绍了弱、最终和强三种一致性模型及其典型应用场景。接着,深入分析了主从(Master-Slave)、多主(Master-Master)这两种常见架构在数据同步上的权衡,特别是强一致性实现的复杂性。最后,重点剖析了分布式事务处理的经典协议——两阶段提交(2PC)及其演进版三阶段提交(3PC),解释了它们的工作原理、核心优势(如强一致性保证)以及可能引发的阻塞风险。 全文在容灾、一致性、性能这个“铁三角”关系中展开,为理解分布式系统的设计哲学与工程取舍提供了扎实的技术脉络。

IT 2014-11-23 20:57:53 / 累计浏览 2,466

分布式缓存的一起问题

这篇文章聚焦于分布式缓存主从架构中一个典型的“踩坑”场景:当master节点突发故障时,原本设计用于保障数据一致性的CAS(Compare-and-Swap)流程却会导致slave副本数据静默过期。作者从实际业务故障出发,剖析了问题根源——master cas失败后并未对slave执行set操作,导致新变更无法写入缓存。 文章进一步探讨了自动切换master角色为何不可行,以及手工切换或采用“delete slave”或“设置短过期”等补救方案时,仍需面对命中率下降、接口职责模糊等棘手权衡。最终,作者将问题抛回给读者:在这种对可用性与一致性都有要求的场景下,一个更完美的解决方案应该如何设计?

IT 2014-11-22 23:48:11 / 累计浏览 1,768

Web框架与太阳系

这篇讲的是作者如何从对现有PHP框架的迷茫中,转向自行设计一个名为“Beahoo”的迷你Web框架。他从太阳系的结构中获得灵感,提出利用“装饰器模式”来构建框架的构想。文章清晰地阐述了框架的核心设计目标:微内核、模块化与扩展性。 作者巧妙地将行星与卫星的关系类比为装饰器模式:月球装饰地球,地球又装饰太阳,层层嵌套,形成可扩展的系统。他展示了框架中仅几百行的Action与Decorator核心代码,这部分实现了类似“DNA双螺旋”的基础结构。随后,通过模拟创建太阳系的代码实例,直观地演示了如何用装饰器模式动态组合功能模块。 作者的核心观点是,借鉴这种自然界分层装饰的模式,可以用极简的代码构建出灵活强大的Web框架。尽管篇幅所限未展开全部功能,但这个从天文现象到软件架构的联想与实现过程,本身提供了一个非常有趣且具启发性的框架设计思路。

IT 2014-11-21 22:59:13 / 累计浏览 11,109

7 天打造前端性能监控系统

这篇讲的是作者从一次公开承诺出发,用7天时间系统化梳理了如何从零搭建前端性能监控系统。文章并非纸上谈兵,而是将“性能影响公司收益”这一核心认知作为起点,引用了Google、Bing等巨头因延迟导致用户量与收入下降的具体数据,强调了监控的必要性。 接着,作者将实施过程拆解为7天,从认知到工具逐步推进。文中重点介绍了Page Speed、WebPagetest、PhantomJS等工具的实战用法,并特别指出了衡量用户体验的关键指标——白屏时间和首屏时间。文章最后落脚于,性能会随产品迭代而衰减,因此需要一套可持续的监控系统来量化问题、指导优化。 整个方案从“为何要做”切入,落到“具体用什么、怎么做”,为希望提升Web页面加载性能的开发者提供了一份清晰的行动蓝图。

IT 2014-11-21 00:14:31 / 累计浏览 15,802

从输入 URL 到页面加载完成的过程中都发生了什么事情?

这篇文章详细拆解了“输入URL到页面加载”这个经典问题的前两个环节,其独特之处在于从最底层的硬件交互开始讲起,串联起了整个技术栈。 作者从用户触摸屏幕的那一刻说起,解释了电容触摸屏如何将物理动作转换为电信号,通过I²C总线传递给CPU。在CPU内部,信号经过晶体管和逻辑门电路,最终触发操作系统的中断机制。以Android为例,内核驱动将触摸事件写入设备文件,再由系统的GUI框架(如EventHub)分发给前台应用,也就是浏览器。 当事件到达浏览器后,文章揭示了其中一些不为人知的优化。例如,Chrome会根据用户输入历史进行“预预测”,在按下回车键之前就可能开始建立网络连接或渲染,以加速页面显示。文章后续部分显然还会继续剖析网络请求、DNS解析等后续流程。 这篇长文并非只为面试准备,而是旨在建立硬件、操作系统与软件之间的关联认知。作者在文中推荐了从《编码》到《Linux内核设计与实现》等多本经典著作,适合希望深入理解计算系统工作原理的读者。

IT 2014-11-19 23:30:42 / 累计浏览 1,867

跨平台移动框架iMAG开发入门

这篇讲的是iMAG这个跨平台移动开发框架的入门上手。文章开宗明义,指出iMAG的核心优势在于“原生跨平台”——它采用XML加JavaScript的方式,将符合规范的代码解释成Android或iOS的本地原生控件来执行,因此拥有与原生应用一致的性能和用户体验。这一点将它明确区别于PhoneGap、JQuery Mobile这类Web技术封装的框架,更适合对性能要求较高的场景。 作者随后介绍了iMAG极为简洁的开发环境。开发者无需在本地搭建环境,只需在官网注册账号,安装手机客户端并使用在线工具,就能实时编辑XML并在手机上刷新查看效果,上手门槛极低。 文章通过一个“Hello World”示例,清晰展示了iMAG的XML结构。例如,使用封装页面,和<content>划分区域,而<list>控件则负责内容布局。这种结构会解释成各自平台的原生组件,比如Android上的TextView或iOS上的UILabel。文末还初步梳理了iMAG的控件体系,将其分为内容、表单和布局三类。总体来说,这篇文章为想快速构建高性能跨平台应用的前端或移动端开发者,提供了一个轻量且高效的新选项。</p> <div class="br-actions" style="margin-top:8px;"> <button type="button" class="br-button" data-reader-favorite data-type="it" data-id="6957" data-title="跨平台移动框架iMAG开发入门" data-url="/it/article/6957" data-mode="local" aria-pressed="false"> <span data-favorite-label>☆ 稍后读</span> </button> </div> </article> <article class="br-card br-plain-card"> <div> <div class="br-meta"> <span class="br-source-dot">IT</span> <span>2014-11-19 23:07:06</span> <span class="br-dot">/</span> <span>累计浏览 3,453</span> </div> <h2 class="br-card-title"><a href="https://blogread.cn/it/article/6946">分布式消息系统尝试(rabbitmq, celery, redis)</a></h2> <p class="br-summary">作者从统一游戏后台架构的需求出发,尝试使用Celery任务队列,并分别以RabbitMQ和Redis作为消息代理,来探索这套方案能否替代以前自研的C++ server通信模式。文章详细记录了在macOS下通过Homebrew安装RabbitMQ、启用其管理插件,并配置Redis和Celery的过程。 随后,作者通过一个简单的“加法”任务,对两种消息代理的性能进行了初步对比。在相同配置下,使用RabbitMQ时任务完成耗时约0.545秒,使用Redis时则约0.604秒。结果显示,在这个简单场景中两者的性能表现相近。 这篇文章为考虑引入任务队列的团队提供了一个具体的实践起点,展示了如何快速搭建并初步评估Celery+RabbitMQ或Celery+Redis这一组合。作者也指出,这只是初步测试,后续还需要对更多复杂场景和更高并发下的性能进行深入验证。</p> <div class="br-actions" style="margin-top:8px;"> <button type="button" class="br-button" data-reader-favorite data-type="it" data-id="6946" data-title="分布式消息系统尝试(rabbitmq, celery, redis)" data-url="/it/article/6946" data-mode="local" aria-pressed="false"> <span data-favorite-label>☆ 稍后读</span> </button> </div> <div class="br-thumb br-compact-thumb is-cached"> <img src="/upload/thumb/2026/05/b50aa6acc6bd36be3c7a87685bb9a4587e0ca42c.png" alt="" loading="lazy"> </div> </article> <article class="br-card br-plain-card br-plain-card--no-thumb"> <div> <div class="br-meta"> <span class="br-source-dot">IT</span> <span>2014-09-17 12:25:15</span> <span class="br-dot">/</span> <span>累计浏览 3,400</span> </div> <h2 class="br-card-title"><a href="https://blogread.cn/it/article/6909">规则引擎简介</a></h2> <p class="br-summary">这篇讲的是如何用规则引擎将现实中的决策逻辑“外挂”到系统里。 文章从保险定价的生动例子切入:一辆红色运动型汽车,如果驾驶员是16-25岁男性,保费就增加20%。这种“如果……那么……”的逻辑,在路由表、权限控制等IT领域无处不在,但硬编码在程序中难以维护。规则引擎正是为了解耦这类业务规则而生。 它模拟了人类专家的推理过程,核心是规则库、事实库和推理引擎三大部件。推理引擎通过模式匹配器、议程和执行引擎来决定哪些规则被触发,以及按什么顺序执行。文中重点介绍了两种推理模式:由事实驱动、向前推导结论的正向推理,以及由目标驱动、向后寻找证据的反向推理。 文章还剖析了规则引擎的高效核心——RETE算法。这个由Charles Forgy发明的算法,通过将规则编译成推理网络,在运行时高效匹配事实与规则,避免了反复遍历的开销。 最终,规则引擎的价值在于让业务逻辑与技术实现分离。开发者不用在代码里写满复杂的if-else,规则可以像数据一样被管理和复用,为业务逻辑的快速迭代提供了坚实的技术底座。</p> <div class="br-actions" style="margin-top:8px;"> <button type="button" class="br-button" data-reader-favorite data-type="it" data-id="6909" data-title="规则引擎简介" data-url="/it/article/6909" data-mode="local" aria-pressed="false"> <span data-favorite-label>☆ 稍后读</span> </button> </div> </article> <article class="br-card br-plain-card br-plain-card--no-thumb"> <div> <div class="br-meta"> <span class="br-source-dot">IT</span> <span>2014-08-13 12:34:57</span> <span class="br-dot">/</span> <span>累计浏览 5,077</span> </div> <h2 class="br-card-title"><a href="https://blogread.cn/it/article/6897">百度是如何使用hadoop的</a></h2> <p class="br-summary">这篇文章讲的是百度如何将Hadoop深度应用于其海量中文搜索及数据处理场景。面对日志存储、网页挖掘、商业分析、在线反馈等复杂需求,百度不仅大规模部署了Hadoop(约700台机器,日均处理120TB数据),还针对实际运行中的效率与可靠性问题进行了系统性改造。 具体来看,百度在多个层面做了定制优化:在MapReduce策略上,通过限制作业并发、调整预测执行和基于节点内存调度来提升稳定性;对HDFS增强了权限控制与容错能力,比如让分区与节点解耦,避免单点故障影响全局。此外,他们还修改了推测执行(Speculative)策略,用速率倒数来更公平地触发备份任务,并引入资源控制机制,甚至修改Linux内核来限制进程内存使用。 文章也坦诚分享了百度在实践中遇到的痛点,包括MapReduce的I/O与排序效率、HDFS的随机访问延迟、内存管理压力以及作业调度精细化等问题,并针对如Streaming只能处理文本数据的局限,提出了自研的Bistreaming方案。这些细节揭示了在超大规模环境下,如何将开源框架“打磨”得更适合生产需求——不仅是使用,更是持续的调优与二次开发。</p> <div class="br-actions" style="margin-top:8px;"> <button type="button" class="br-button" data-reader-favorite data-type="it" data-id="6897" data-title="百度是如何使用hadoop的" data-url="/it/article/6897" data-mode="local" aria-pressed="false"> <span data-favorite-label>☆ 稍后读</span> </button> </div> </article> <article class="br-card br-plain-card br-plain-card--no-thumb"> <div> <div class="br-meta"> <span class="br-source-dot">IT</span> <span>2014-07-28 12:43:31</span> <span class="br-dot">/</span> <span>累计浏览 2,551</span> </div> <h2 class="br-card-title"><a href="https://blogread.cn/it/article/6893">CAP 理论</a></h2> <p class="br-summary">这篇技术文章深入剖析了CAP理论这个分布式系统的经典法则,指出很多人对其存在理解误区。作者从Brewer的原始猜想和Gilbert & Lynch的严谨证明出发,澄清了C、A、P三个属性在证明中的严格界定——尤其是将一致性(C)等同于数据库ACID中的原子性,这一点是理解后续讨论的关键。 文章梳理了CAP证明所依赖的强假设(如纯异步网络),并讨论了在现实中放松这些条件的可能。例如,放弃分区容错(P)意味着可扩展性受损,放弃可用性(A)则无法容忍服务中断,因此主流的分布式存储系统(如Cassandra、Dynamo)通常选择放宽一致性,转向最终一致性模型。 作者还对比了两种试图“挑战”CAP的思路:一种是通过引入版本控制和操作排队规则,让系统在不同时段分别满足CAP属性;另一种是通过数据模型重构(如仅追加数据、将读操作转化为查询),以更简单的方式拥抱最终一致性,从而规避CAP带来的复杂性。文章最终指出,CAP定理依然稳固,未来的关键或许在于如何通过巧妙设计绕过其严格限制的区域。</p> <div class="br-actions" style="margin-top:8px;"> <button type="button" class="br-button" data-reader-favorite data-type="it" data-id="6893" data-title="CAP 理论" data-url="/it/article/6893" data-mode="local" aria-pressed="false"> <span data-favorite-label>☆ 稍后读</span> </button> </div> </article> <article class="br-card br-plain-card br-plain-card--no-thumb"> <div> <div class="br-meta"> <span class="br-source-dot">IT</span> <span>2014-05-27 22:56:54</span> <span class="br-dot">/</span> <span>累计浏览 2,733</span> </div> <h2 class="br-card-title"><a href="https://blogread.cn/it/article/6873">Dynamo和Cassandra海量存储基础</a></h2> <p class="br-summary">这篇讲的是Dynamo和Cassandra这两个经典分布式存储系统,在核心设计哲学上的对比与剖析。文章从它们共享的基石概念入手,比如用W+R>N公式如何决定读写一致性级别,并用主备复制、Quorum机制等实例具体说明了N、W、R取值的影响。 真正的分歧点在于处理数据冲突的策略。Dynamo选择了更复杂的向量时钟,它像Git一样记录数据版本的来源,当检测到并行的、可能冲突的写入时,会保留所有版本交由应用层合并,适合能处理合并逻辑的场景。而Cassandra则采取了更粗暴的简化——时间戳方案,它不检测冲突,直接以最新时间戳的数据为准。这极大降低了复杂度,适用于大多数对冲突不敏感的场景。 文章还追溯了两者共同的基础——Gossip协议,并提及了它在去中心化通信中的优势与维持一致性的挑战。作者的对比最终导向了一个深刻的观点:在大多数写入冲突概率较低的场景下,这种最终一致性模型比强一致全局排序(如Paxos)更高效。两种不同的冲突解决路径,正体现了在工程化实现中对一致性权衡的不同哲学。</p> <div class="br-actions" style="margin-top:8px;"> <button type="button" class="br-button" data-reader-favorite data-type="it" data-id="6873" data-title="Dynamo和Cassandra海量存储基础" data-url="/it/article/6873" data-mode="local" aria-pressed="false"> <span data-favorite-label>☆ 稍后读</span> </button> </div> </article> <article class="br-card br-plain-card br-plain-card--no-thumb"> <div> <div class="br-meta"> <span class="br-source-dot">IT</span> <span>2014-04-29 22:47:52</span> <span class="br-dot">/</span> <span>累计浏览 1,969</span> </div> <h2 class="br-card-title"><a href="https://blogread.cn/it/article/6858">Erlang公平调度的误解</a></h2> <p class="br-summary">这篇讲的是Erlang引以为傲的“公平调度”哲学,在实际工程中可能并不像想象中那么完美。作者从Erlang虚拟机(BEAM)的时间片分配、抢占式调度说起,点明了它在云计算等场景下保障用户体验的初衷。 但文章的重点在于“祛魅”。作者指出,尽管Erlang的BIF、NIF等模块都在努力维护公平,但一些基础设计环节却可能无意中打破这种平衡。例如,消息队列的无保护单向队列结构,在极端负载下可能导致队列暴增和内存激增;而内存分配器在向系统申请内存时使用的锁,以及SMP架构下难以避免的锁竞争,都可能成为公平性的破坏者。文章最终总结,这些实现细节上的“坑”影响了Erlang在某些情况下的公平性表现,也解释了为何近期Erlang引入dirty scheduler等新机制来应对。 作者最后将视角拉高,提醒架构师需从上到下,在业务层面也进行“公平”设计,才能与系统哲学和谐统一。世界没有绝对公平,但理解其边界至关重要。</p> <div class="br-actions" style="margin-top:8px;"> <button type="button" class="br-button" data-reader-favorite data-type="it" data-id="6858" data-title="Erlang公平调度的误解" data-url="/it/article/6858" data-mode="local" aria-pressed="false"> <span data-favorite-label>☆ 稍后读</span> </button> </div> </article> <article class="br-card br-plain-card br-plain-card--no-thumb"> <div> <div class="br-meta"> <span class="br-source-dot">IT</span> <span>2014-04-13 22:39:18</span> <span class="br-dot">/</span> <span>累计浏览 5,471</span> </div> <h2 class="br-card-title"><a href="https://blogread.cn/it/article/6844">写Java也得了解CPU缓存</a></h2> <p class="br-summary">这篇讲的是,为什么像Java这样的高级语言开发者,也不能忽视底层的CPU缓存。作者从LMAX Disruptor框架和马丁关于“机械同理心”的博文出发,打破了“只有C/C++才需要懂CPU”的常规认知。 文章重点解析了CPU的三级缓存(L1/L2/L3)结构,并通过具体数据对比了各层级与CPU核心、内存之间的访问延迟差异,直观展现了数据局部性的重要性。作者还通过一段Java数组遍历代码的对比,生动演示了缓存行(Cache Line)的影响:符合内存访问顺序的循环,比按列访问的性能快了近70倍。这背后的原因,正是前者能高效利用单次缓存行加载的数据块,而后者则导致了大量不必要的缓存失效。 最终,文章梳理了导致缓存失效的三种常见情况(首次访问、冲突、缓存满),为优化程序性能指明了方向。这提醒我们,即使编写Java应用,理解硬件行为也能解锁显著的性能潜力。</p> <div class="br-actions" style="margin-top:8px;"> <button type="button" class="br-button" data-reader-favorite data-type="it" data-id="6844" data-title="写Java也得了解CPU缓存" data-url="/it/article/6844" data-mode="local" aria-pressed="false"> <span data-favorite-label>☆ 稍后读</span> </button> </div> </article> <nav class="br-pagination" aria-label="pagination"> <ul class="pagination pagination-sm"><li class="page-item"><a class="page-link" href="/it/category/17">|<</a></li><li class="page-item"><a class="page-link" href="/it/category/17/2">2</a></li><li class="page-item"><a class="page-link" href="/it/category/17/3">3</a></li><li class="page-item"><a class="page-link" href="/it/category/17/4">4</a></li><li class="page-item"><a class="page-link" href="/it/category/17/5">5</a></li><li class="page-item active" aria-current="page"><span class="page-link">6</span></li><li class="page-item"><a class="page-link" href="/it/category/17/7">7</a></li><li class="page-item"><a class="page-link" href="/it/category/17/8">8</a></li><li class="page-item"><a class="page-link" href="/it/category/17/9">9</a></li><li class="page-item"><a class="page-link" href="/it/category/17/10">10</a></li><li class="page-item"><a class="page-link" href="/it/category/17/11">11</a></li><li class="page-item"><a class="page-link" href="/it/category/17/37">>|</a></li></ul> </nav> </section> <aside class="br-stack br-sidebar" aria-label="IT sidebar"> <section class="br-side-card"> <h2>近 3 天十大热文</h2> <ol class="br-rank-list"> <li><span class="br-rank">1</span><a href="https://blogread.cn/it/article/4237?f=hot3">浏览器的工作原理:新式网络浏览器幕后揭秘<small>近 3 天 87 浏览</small></a></li> <li><span class="br-rank">2</span><a href="https://blogread.cn/it/article/6189?f=hot3">彻底屏蔽优酷广告<small>近 3 天 65 浏览</small></a></li> <li><span class="br-rank">3</span><a href="https://blogread.cn/it/article/6194?f=hot3">linux下搜索find命令详解<small>近 3 天 60 浏览</small></a></li> <li><span class="br-rank">4</span><a href="https://blogread.cn/it/article/8379?f=hot3">Postmortem: 关于 xzutil <small>近 3 天 58 浏览</small></a></li> <li><span class="br-rank">5</span><a href="https://blogread.cn/it/article/5917?f=hot3">ZooKeeper管理员指南——部署与管理Z<small>近 3 天 57 浏览</small></a></li> <li><span class="br-rank">6</span><a href="https://blogread.cn/it/article/7905?f=hot3">浅谈 WHR 全历史排名<small>近 3 天 56 浏览</small></a></li> <li><span class="br-rank">7</span><a href="https://blogread.cn/it/article/4223?f=hot3">Google Megastore系统事务机制<small>近 3 天 54 浏览</small></a></li> <li><span class="br-rank">8</span><a href="https://blogread.cn/it/article/4343?f=hot3">高性能EL――Fel探秘,兼谈EL<small>近 3 天 53 浏览</small></a></li> <li><span class="br-rank">9</span><a href="https://blogread.cn/it/article/8382?f=hot3">让 AI 把我的 PHP 博客重写成 Go<small>近 3 天 43 浏览</small></a></li> <li><span class="br-rank">10</span><a href="https://blogread.cn/it/article/1093?f=hot3">为什么GPL是更好的开源许可证?<small>近 3 天 39 浏览</small></a></li> </ol> </section> <section class="br-side-card" style="padding:12px;text-align:center;"> <ins class="adsbygoogle" style="display:inline-block;width:250px;height:250px" data-ad-client="ca-pub-2206192680127944" data-ad-slot="5430998082"></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script> </section> </aside> </main> <footer class="br-shell" style="padding-top:12px;padding-bottom:20px;color:var(--br-muted);font-size:13px;"> <div style="text-align:center;line-height:1.9;"> © 2009 - 2026 by blogread.cn  ·  微博:<a href="https://weibo.com/blogread" target="_blank" style="color:var(--br-accent)">@IT技术博客大学习</a>  ·  <span class="news-footer-trust-links"><a href="/about.html">关于</a> · <a href="/contact.html">联系</a> · <a href="/privacy.html">隐私</a> · <a href="/disclaimer.html">内容来源声明</a></span>  ·  <a href="https://beian.miit.gov.cn/" target="_blank">京ICP备15002552号-1</a> </div> </footer> <!-- Bootstrap 5 bundle (含 Popper); 不再依赖 jQuery。 --> <script src="/plugins/bootstrap-5.3.8/js/bootstrap.bundle.min.js"></script> <script src="/assets/frontend-modern/reader-actions.js"></script> </body> </html>