← 返回展厅
Memcached

Memcached

年份:2003
平台:跨平台
开发者:Danga Interactive

轻量级分布式缓存,极大加速动态 Web 应用响应。

浏览:8
点赞:0

简要介绍

【互联网纪元厅】

2003年,Memcached正式问世。由Danga Interactive主导开发,面向跨平台平台用户。

轻量级分布式缓存,极大加速动态 Web 应用响应。

技术特色:缓存、分布式、性能优化。

影响力评估:技术维度 8/10,商业维度 7/10,文化维度 4/10,用户维度 7/10。

作为互联网纪元厅的经典代表,Memcached在软件发展史上留下了深刻的印记。

详细介绍

2003年的互联网世界,正处在一个奇妙的转折点上。那一年,Google刚刚凭借其简洁的搜索界面和PageRank算法统治了桌面浏览器,亚马逊的云计算服务AWS还只是一个内部工具,而Facebook、Twitter、YouTube这些后来改变人类社交方式的巨头甚至尚未诞生或刚刚萌芽。然而,一个看似不起眼却影响深远的危机,正在一家名为LiveJournal的博客平台上悄然酝酿。正是这个危机,催生了一个后来成为整个互联网基础设施的软件——Memcached。

要理解Memcached诞生的必然性,我们需要先回到那个时代的Web技术环境。2003年,动态网站的主流架构是LAMP——Linux、Apache、MySQL和PHP(或Perl、Python)。这种组合让网站能够根据用户请求实时生成页面,但代价是每一次页面加载都可能触发多次数据库查询。对于流量尚可的小型网站,这并非问题;但对于像LiveJournal这样拥有数百万用户、且每个用户都能随时发布日志、评论、更新好友动态的社交平台,数据库很快就成了整个系统的瓶颈。用户的每一次刷新,都可能意味着后台数据库要执行数十次甚至上百次SQL查询。当用户同时在线数达到数万甚至数十万时,数据库服务器会因过载而崩溃,页面加载时间从几秒飙升到几十秒,甚至直接返回“数据库连接过多”的错误页面。这种体验,对于任何追求增长的网站来说都是致命的。

LiveJournal的创始人Brad Fitzpatrick,当时还只是一个20出头的年轻程序员。他1999年创立LiveJournal时,初衷仅仅是为自己和朋友们提供一个写日记的地方。但随着平台意外走红,用户数量呈指数级增长,Fitzpatrick不得不从一名单纯的开发者,迅速转变为一名系统架构师。他每天面对的核心问题只有一个:如何让数据库活下去?传统的解决方案包括增加数据库服务器、使用读写分离、或者购买更昂贵的硬件。但这些方法要么成本高昂,要么治标不治本。Fitzpatrick意识到,数据库的负载之所以高,是因为大量查询是重复的——同一个用户的个人资料、同一篇文章的阅读数、同一组好友的最新动态,可能在几秒钟内被成千上万次请求。如果能把这些重复查询的结果暂时保存在某个地方,让后续的相同请求直接读取缓存,而不是每次都去数据库里翻找,那么数据库的压力就能大幅减轻。

这个想法并不新鲜——缓存是计算机科学中古老而有效的概念。但Fitzpatrick想要的是一个专门针对Web应用场景分布式、且极其轻量的缓存系统。他之前为LiveJournal写过一些简单的内存缓存代码,但那些代码与业务逻辑耦合太紧,扩展性差。2003年,他决定把这些缓存功能彻底独立出来,做成一个通用的、可被任何应用调用的服务。于是,Memcached的第一个版本诞生了。有趣的是,这个第一版是用Perl语言编写的。Perl是当时Web开发中非常流行的脚本语言,灵活但性能有限。Fitzpatrick很快意识到,Perl解释器的开销和内存管理机制无法支撑高并发的场景。他做出了一个关键决定:用C语言重写核心代码。C语言提供了接近硬件的性能控制,能够直接管理内存分配和回收,这正是构建高性能缓存系统所需要的。

2004年,Danga Interactive(LiveJournal的母公司)正式发布了Memcached 1.1版本,完全用C语言实现。这个版本奠定了Memcached后来十余年不变的核心架构:一个简单的键值对存储系统,所有数据都保存在内存中,采用LRU(最近最少使用)算法自动淘汰旧数据,通过客户端实现分布式一致性哈希。这些设计决策,每一个都体现了极致的简洁主义。没有复杂的查询语言,没有持久化机制,没有事务支持,甚至没有内置的认证和加密。Memcached只做一件事:把数据放在内存里,以最快的速度读写。它的API只有寥寥几个命令:get、set、add、replace、delete、incr、decr。这种“少即是多”的设计哲学,后来被无数开发者奉为圭臬。

Memcached的分布式特性尤为精妙。它并没有在服务器端实现复杂的节点通信或数据同步,而是把分布式的责任完全交给了客户端。客户端使用一致性哈希算法,根据键的哈希值决定将数据存储在哪个Memcached服务器上。这意味着,只要增加或减少服务器,只需要重新计算哈希环,大部分缓存键仍然能够命中正确的节点,只有少量数据需要重新分布。这种设计让Memcached集群的扩展变得极其简单:你只需启动新的Memcached进程,更新客户端的服务器列表即可。在2000年代初期,当大多数工程师还在为如何构建可扩展的分布式系统而苦恼时,Memcached用这种近乎“偷懒”的方式,优雅地解决了问题。

Memcached的开源,是它走向全球的关键一步。2003年,Fitzpatrick将代码发布在LiveJournal的网站上,并采用了BSD许可证。这意味着任何人都可以自由地使用、修改和分发代码,甚至可以将它集成到商业产品中。很快,Memcached的社区开始形成。开发者们贡献了各种语言的客户端库:PHP、Python、Ruby、Java、C++……几乎每一种主流编程语言都能找到对应的Memcached客户端。这种生态的繁荣,让Memcached迅速成为Web开发者的标配工具。

2007年,Memcached迎来了一个重要的版本——1.2.0,引入了二进制协议。在此之前,Memcached使用的是基于文本的ASCII协议,虽然简单易读,但解析效率较低,且容易受到网络包分割等问题的影响。二进制协议通过固定的消息格式和更紧凑的编码,显著提升了网络传输效率,尤其是对于大量小对象的读写场景。同年,Facebook的工程师们开始大规模使用Memcached。Facebook的规模远非LiveJournal可比,他们需要管理数千台Memcached服务器,每天处理数十亿次缓存请求。Facebook团队对Memcached进行了大量优化,包括改进内存分配器、优化LRU算法、增加多线程支持等。这些改进中的一部分被回馈给了开源社区,成为了Memcached后续版本的一部分。

2009年发布的1.4.0版本,是Memcached发展史上的又一个里程碑。这个版本引入了多线程支持。在此之前,Memcached是单线程的——它使用一个主线程监听网络请求,通过事件驱动的方式处理所有连接。单线程模型的好处是简单、无锁、性能可预测,但无法充分利用多核CPU的计算能力。随着服务器硬件的发展,CPU核心数越来越多,单线程模型逐渐成为瓶颈。1.4.0版本通过引入工作线程池,让Memcached能够同时处理多个请求,性能得到了大幅提升。不过,多线程也带来了锁竞争和内存管理复杂化的问题。Memcached的开发者们选择了一种折中方案:每个工作线程拥有独立的连接队列,但共享同一个内存池。这种设计在保持高性能的同时,避免了复杂的全局锁。

2013年发布的1.4.17版本,对LRU算法进行了重大改进。传统的LRU算法在缓存满了之后,会淘汰最近最少使用的数据。但在高并发场景下,LRU算法可能表现出“缓存抖动”现象——某些热点数据刚刚被访问过,却因为大量冷数据的涌入而被淘汰。Memcached 1.4.17引入了“LRU爬虫”机制,它会在后台异步扫描LRU链表,主动淘汰那些即将过期或很少使用的数据,而不是等到缓存满了才进行淘汰。这个改进让缓存命中率在极端负载下依然保持稳定。

2020年发布的1.6.0版本,是Memcached近年来的一个重要更新。这个版本引入了外部存储引擎的支持。长期以来,Memcached只支持内存存储,这意味着一旦服务器重启,所有缓存数据都会丢失。虽然这符合缓存的设计初衷(缓存数据应该是可丢弃的),但在某些场景下,用户希望缓存能够持久化,或者能够利用SSD等低成本存储介质来扩展容量。1.6.0版本通过插件化的存储引擎接口,允许开发者实现自己的存储后端。例如,Facebook就开发了一个名为“Memslap”的存储引擎,将Memcached的数据存储在Flash存储上,在保持低延迟的同时大幅降低了成本。

Memcached的市场影响是深远的。它不仅被Facebook、Twitter、YouTube、Wikipedia等顶级互联网公司采用,还成为了几乎所有Web框架的默认缓存后端。Django、Ruby on Rails、Symfony、Zend Framework等流行框架,都内置了对Memcached的支持。对于中小型网站来说,部署Memcached几乎不需要额外的学习成本:安装一个服务,修改几行配置,就能让页面加载速度提升数倍。这种“开箱即用”的体验,让Memcached成为了Web 2.0时代的基础设施组件。

在Memcached的启发下,后续的缓存系统如Redis(2009年发布)借鉴了其内存缓存和键值存储的思想,但增加了持久化、更丰富的数据结构(如列表、集合、有序集合)、发布订阅等功能。Redis的诞生,某种程度上是对Memcached“简单”哲学的补充——它保留了Memcached的高性能,同时满足了开发者对更多数据操作的需求。不过,Memcached的拥护者认为,Redis的复杂性带来了额外的学习成本和运维负担,而Memcached的简单性正是其最大的优势。两种设计哲学至今仍在激烈争论,但不可否认的是,Memcached为整个NoSQL缓存领域奠定了基石。

在科技史中,Memcached的地位类似于“第一个吃螃蟹的人”。它证明了分布式内存缓存是解决Web应用性能瓶颈的有效手段,也证明了“简单就是最好的架构”这一真理。它的设计理念——无共享架构、客户端分片、LRU淘汰、无持久化——后来被无数系统借鉴。甚至可以说,现代微服务架构中无处不在的缓存层,其思想源头都可以追溯到2003年那个为拯救LiveJournal数据库而诞生的Perl脚本。

关于Memcached的轶事,也充满了程序员式的幽默和智慧。据说Brad Fitzpatrick最初给这个项目起名为“Cache”,但觉得太普通,于是加上了“Mem”表示内存,又加上了“d”让它听起来更像一个守护进程。至于“Memcached”这个名字的发音,至今仍然是社区争论的话题——有人读作“mem-cash-d”,有人读作“mem-cached”,甚至有人读作“mem-cach-ee-d”。Fitzpatrick本人对此的态度是:“只要你用对了怎么读都行。”

另一个广为流传的故事是,Facebook的工程师曾经在Memcached的代码中发现了一个隐藏的“彩蛋”:当缓存命中率低于某个阈值时,Memcached会在日志中输出一句“Are you sure you want to cache this?”。这个彩蛋后来被移除,但它体现了Memcached开发者的一种态度——他们希望用户理解缓存的工作原理,而不是盲目地使用。

如今,距离Memcached的第一个版本已经过去了二十多年。互联网的流量规模已经增长了数千倍,云计算、容器化、微服务、边缘计算等新技术层出不穷。但Memcached依然在无数数据中心中默默运行,处理着每秒数以亿计的缓存请求。它的代码库依然保持简洁,核心逻辑只有几千行C代码。它的设计哲学——专注于一件事,做到极致——依然是软件工程中最宝贵的智慧之一。

在软件博物馆中,Memcached的展品或许只是一段简短的代码,几行配置文件,以及一张描述其架构的示意图。但它的故事,是关于一个年轻程序员如何用最简单的工具,解决了一个最复杂的问题;是关于一个开源项目如何从一个博客平台的内部工具,成长为支撑整个互联网的基础设施;是关于“简单”这种品质,在日益复杂的技术世界中,依然拥有不可替代的力量。

深度研究

影响力评价

技术影响商业影响文化影响用户规模8889
8.3
综合影响力评分
评分基于技术、商业、文化、用户四个维度的综合考量
🔧技术创新
显著8/10

对技术发展和工程实践的推动程度

💼商业影响
显著8/10

对商业模式和市场格局的影响深度

🎭文化遗产
显著8/10

在科技文化和社会层面的持久影响力

👥用户覆盖
卓越9/10

用户群体的广度和普及程度

评论区 (0)

登录 后参与评论

加载中...