← 所有文章

工程哲学:Salvatore Sanfilippo(antirez)

Salvatore Sanfilippo(antirez),Redis 的创造者

核心要点

  • 他的核心原则是少做——一个你能完整装进脑子里的小而简单的系统,胜过一个庞大、功能齐全的系统。 Salvatore Sanfilippo,网名 antirez,刻意把 Redis 做成一个小巧的存储系统:单线程、驻留内存、用整洁的 C 写成,并且对任何会增加理解难度的功能都坚决排斥。他的随笔反复回到同一个靶子——我们在添加功能时,从不计较自己引入的复杂度。15
  • 他在 2009 年创造了 Redis,它后来成为世界上使用最广泛的数据库之一。 Redis——这个驻留内存的数据结构存储系统——于 2009年2月26日首次发布,源于他为意大利创业公司 LLOOGG(一款实时网络日志分析器)扩展规模的尝试。此后十一年间,他一直是它唯一的维护者和“终身仁慈独裁者”。12
  • Redis 的单线程是有意为之的设计,而这正是一项优点。 Redis 不去追逐多核吞吐量,而是在单个线程上逐条执行命令——这消除了竞态条件和锁开销,让模型保持简单,而且速度足够快,因为正如 Redis FAQ 所言:“对 Redis 而言,CPU 成为瓶颈的情况并不常见,通常 Redis 受限于内存或网络。”7
  • 他把代码视作由人写给人看的东西。 在《Writing system software》系列随笔中,他主张源代码“应当被阅读,而不仅仅是被执行,因为它是由人写给人看的”,而可读代码的目标是“降低读者在阅读代码时需要付出的努力,以及需要装进脑子里的细节数量”。4

原则

“我们正在摧毁软件,因为在添加功能或优化某个维度时,我们不再把复杂度纳入考量……我们正在用一条荒谬的依赖链摧毁软件,让一切都变得臃肿而脆弱……我们正在摧毁软件,因为我们造出的系统不再能向下缩放:简单的事情在任何系统里都应当简单地完成。” —— Salvatore Sanfilippo,《We are destroying software》5

大多数工程是做加法。有人提出一个功能需求,于是你把它加上。某个依赖能省下一周时间,于是你把它引进来。某项优化能让一位用户受益,于是你把它写进核心。每一步看上去都局部合理——而它们的总和,是一个再没有人能完整装进脑子里的系统。Sanfilippo 的本能恰恰相反。在他的哲学里,最危险的一行代码,是你没有先问自己“是否根本可以不写”就写下的那一行。少做。 问题从来不是“这东西还能做什么”,而是“它可以不做什么,却依然值得使用”。5

这条原则最清晰的体现就是 Redis 本身。它在命令执行上是单线程的——这个选择在 2009 年看上去几乎是离经叛道,当时整个行业都在争相压榨多核性能。17 但其中的推理,正是把原则落成了架构。一个一次只执行一条命令的单线程,没有竞态条件,没有锁,没有读到一半被打断的数据,也没有两个线程同时改写同一个键的 bug。心智模型坍缩成一个人真正能够推理的东西:命令一条接一条、按顺序、原子地发生。而在实践中它几乎没有放弃什么,因为在 CPU 成为限制之前,Redis 早就“受限于内存或网络”了。7 并发带来的复杂度,是 antirez 拒绝为之买单的成本——而那份收益,绝大多数工作负载根本用不上。

这种拒绝有两位同伴相随,正是它们让拒绝变得划算。第一位是丰富的原语:Redis 不把每个问题都硬塞进单一的键值模型,而是把字符串、哈希、列表、集合、有序集合和流作为原生数据结构提供出来,于是合适的工具往往一开始就在工具箱里。1 第二位是写给人看的代码:他坚持源代码是“由人写给人看的”,好的代码会降低“读者需要装进脑子里的细节数量”。4 给人几样强大的原语,做得比他们要求的更少,并把整个东西写成一个人仍能读懂的样子。 这就是原则,而 Redis 就是证明。

背景

Salvatore Sanfilippo 于 1977年3月7日出生在意大利西西里的坎波贝洛迪利卡塔(Campobello di Licata)1 他在西西里南部一个边缘地区长大,靠近杰拉(Gela),十七岁时搬到巴勒莫学习建筑——这个学位他从未读完,后来把重心转向计算机科学,并且基本上靠自学学会了编程。1 值得记住的细节是,他是自学成才的,没有读完大学的计算机科学学位;这门手艺来自动手做事,而非来自一纸文凭。这在本系列中是个反复出现的形状——一位深耕实践者,其权威建立在他造出了什么,而非别人教了他什么。

他在这个领域留下的第一个印记是在安全领域,而非数据库。他写了 hping,一个用于 TCP/IP 协议、面向安全测试的开源数据包生成与分析工具。1 更具影响力的是,他在 1998 年公布了空闲扫描(idle scan)——一种隐蔽的端口扫描技术,最初称为“dumb scan”,它能判断目标上哪些服务处于开放状态,“而不会留下指向自身的痕迹”。6 它的工作原理是利用一个旁路信道:一台空闲的第三方“僵尸”主机,其 IP ID 计数器可被预测,攻击者把它当作盲代理来推断目标的响应。6 这一技术足够巧妙,被纳入了 nmap 和 hping,至今仍在其中。6 这与后来定义 Redis 的本能如出一辙——在一个看似困难的问题底下,找到那个优雅的机制。

Redis 本身源于一个实实在在的扩展难题。在 2000 年代末,Sanfilippo 经营着 LLOOGG,一家正在构建实时网络日志分析器的意大利创业公司,而当时已有的数据库跟不上他所需的写入速率。1 于是在 2009 年,他自己造了一个驻留内存的存储系统,并于 2009年2月26日发布了 Redis12 它迅速传播开来,赞助方也随着它的崛起而更替:VMware 于 2010年3月聘用了他Pivotal Software(VMware 的一家分拆公司)于 2013年5月接手赞助,Redis Ltd. 又在 2015年6月接过来。1 他担任了该项目唯一的维护者和 BDFL 长达十一年,随后在 2020年6月30日卸任,由 Yossi Gottlieb 和 Oran Agra 接棒。1 2024年12月,他重返 Redis,担任布道者和活跃的贡献者——这是一位难得的创造者,在巅峰时离开,又回来了。1

作品

Redis 及其数据结构:强大的原语,而非一块空白的键值画布

先从 Redis 与众不同之处说起,因为它正是原则落成的产品。大多数键值存储给你的恰恰只是那一点东西——一个键、一坨不透明的值,以及自己搭建其余一切的负担。Redis 则提供作为原语的丰富数据结构:字符串、哈希、列表、集合、有序集合,以及自 Redis 5.0 起的流。1 每一种都是原生的、服务器端的类型,带有各自的命令,于是那些你本来要在应用代码里手工实现的数据结构,已经住在数据库里,由那个单线程原子地操作。17 它带来的回报是:棘手的应用功能坍缩成寥寥几条命令,因为合适的原语早就在那里了。

最鲜明的例子是有序集合(ZSET)。它是一个由唯一成员组成的集合,每个成员携带一个浮点分数,而 Redis 让这些成员“按顺序排列”——排序是数据结构本身的属性,而非在请求时才计算出来的东西。3 在底层,它是一个双端口结构,一个跳表搭配一个哈希表,这带来了 O(log(N)) 的插入,以及读取已排序结果时额外开销。3 你用 ZADD 添加或更新某个成员的分数,用 ZRANK(从低到高)或 ZREVRANK(从高到低)读取某个成员的排名。3 它最典型的用例,正是每款游戏都需要、而每个传统数据库都头疼的那一个:排行榜。正如 Redis 文档所说:“你可以用有序集合,轻松维护一款大型在线游戏中最高分的有序榜单。”3

它作为工程为何重要:在关系型数据库里做一个排行榜是真正的折磨。每次分数变化都意味着一次 UPDATE,而每一次“这位玩家排第几”的查询,都意味着对整张表的 ORDER BY,或者维护一个索引——这些工作量随玩家数量增长,并在高负载下相互争用。而在 Redis 里,排名是结构固有的。ZADD 的开销是 O(log(N)),ZREVRANK 的开销是 O(log(N)),而且集合本来就排好序了,所以读取前十名轻而易举。3 这个功能变简单,不是因为 Redis 在做同样的工作时更快——而是因为 Sanfilippo 选择提供了一个其形状本身就是解法的原语。这就是从用户一侧看到的“少做”:数据库把难的部分做了一次,于是上千个应用永远都不必再做。

单线程与驻留内存:把简单当作设计的中心

Redis 做了两个看似限制、实则正是其力量之源的选择。它是驻留内存的——工作数据集存放在 RAM 中,持久化则通过快照和一个追加写文件叠加实现——而且在命令执行上是单线程的,在单个核心上一次处理一个请求。17 这两个选择都是乔装打扮的“少做”。

单线程这个决定更违反直觉,而其中的推理值得跟着走一遍。一个多线程的存储系统必须协调对共享数据的并发访问——锁、原子操作、无锁结构、内存屏障——而正是这套机制,藏着数据库里多得吓人的 bug 与难以预测的延迟。通过一次只执行一条命令,Redis 让每条命令在构造上就是原子的:没有需要推理的交错,没有会忘记的锁,没有要调试的竞态。7 官方 FAQ 对此代价为何如此之小说得很直白:“对 Redis 而言,CPU 成为瓶颈的情况并不常见,通常 Redis 受限于内存或网络”,而单线程“避免了竞态条件以及与线程相关的、消耗 CPU 的上下文切换”。7 这个设计放弃的吞吐量,本就是大多数工作负载永远用不上的;它换来的简单,则在每一行代码、每一次凌晨三点的调试中被一一偿还。

这与他在随笔中那种拒绝添加复杂度的脾性如出一辙。他把这种失败模式刻画得很精确:“我们正在摧毁软件,因为在添加功能或优化某个维度时,我们不再把复杂度纳入考量。”5 多线程恰恰是那种优化——只针对一个维度,也就是原始 CPU 吞吐量——它本会成倍放大系统的复杂度,换来的却是大多数用户从不需要的收益。对它说不,让 Redis 保持为一个人能装进脑子里的系统,而正是这一属性,让一个人维护了它十一年。1

Salvatore Sanfilippo 在西西里领取创新奖

这门手艺:写给人看的 C,以及为注释辩护

第三部分作品不是一项功能,而是一种关于代码该如何被写就的立场。Sanfilippo 用 C 写 Redis——一门没有护栏的语言,程序员要对每一个字节负责——而他把那份 C 的可读性当作头等大事,而非事后才补的东西。他的随笔《Writing system software: code comments》是一篇异常直接的论证,主张源代码首先作为沟通而存在。他写道,代码“应当被阅读,而不仅仅是被执行,因为它是由人写给人看的”。4 可执行的行为只是工作的一半;另一半属于下一个人——往往就是未来的你——他得读懂它。

从这个前提出发,他推导出一套关于注释与清晰度的工作理论。他主张,可读代码的目标是“降低读者在阅读代码时需要付出的努力,以及需要装进脑子里的细节数量”。4 当一条注释能消除读者本来不得不自行重建的细节时,它就赢得了自己的位置——一个不显然的选择为何如此、一个函数所假设的不变量、一条快速路径存在的理由。这是最深层意义上的手艺:不是耍聪明,而是为后来者着想。它与“少做”原则严丝合缝地配套,因为系统越小、越简单,需要承载的细节就越少,代码也就能对仅剩的那些细节越诚实。

Salvatore Sanfilippo 在 2025 年的舞台上演讲

同样的信念驱动着他对软件走向的更广泛批评。他警告人们提防“一条荒谬的依赖链,让一切都变得臃肿而脆弱”,也提防那些“不再能向下缩放”的系统:“简单的事情在任何系统里都应当简单地完成。”5 Redis 就是他这一论点的可执行版本——一个依赖很少、核心小而可懂、且简单之事始终保持简单的系统。手艺不是工程之上的装饰;它就是工程。

方法

把 Redis、空闲扫描、关于注释与复杂度的随笔,以及那个单线程放在一起读,同样的几项承诺一再浮现。Sanfilippo 的方法与其说是一句口号,不如说是一组固定的习惯。

少做——最危险的代码,是你本不必写的那些。 最具定义性的习惯是做减法:在添加一个功能、一个依赖或一项优化之前,先问系统能否在没有它的情况下存活。他直接点名了这种失败模式——添加复杂度时“没有把它纳入考量”。5 这个教训远远超出数据库的范畴:你没写的每一行,都是不会出错、不会让下一位读者困惑、也不必维护十年的一行。这是把最小可敬产品用在系统核心的层面上——交付那个真正值得使用的最小之物,并顶住它持续要膨胀的压力,守住它的小。

交付强大的原语,而非预制的策略。 Redis 交给你有序集合、流和哈希——一些通用的结构,你能用它们搭出排行榜、队列和限流器——而不是为每一样都做一个定制功能。3 这个固定习惯,是去找到那个能解决一整类问题的底层机制,并交付那个东西,于是数据库把难的部分做一次就够了。这与 Roberto Ierusalimschy 用 Lua 的表和元表下的注是同一个——给人锋利、通用的杠杆,让他们自己搭出其余部分——而这份亲缘并非偶然,因为 Redis 内嵌了 Lua,正是为了做这件事。

即便以吞吐量为代价,也要选择简单。 单线程设计是最清晰的一例:Redis 在命令执行上拒绝多核并行,因为它换来的简单——没有竞态、没有锁、在构造上即原子——比那些核心更值钱,而且 CPU 本就很少是瓶颈。7 这门功夫,在于知道究竟是哪个维度在真正约束你,并拒绝用复杂度去优化一个并不构成约束的维度。这是把证据门槛用在性能上:不要因为并发听起来很快就把它加进去;去测量瓶颈究竟在哪,而大多数时候,它不是 CPU。

为下一个读它的人写代码。 源代码“是由人写给人看的”,而一条注释的职责,是降低读者必须承载的细节。4 这个习惯,是把可读性和解释性注释当作正确性的一部分,而不是日后才补的点缀——因为一个无人能懂的系统,就是一个无人能安全更改的系统。这与 Donald Knuth 用文学式编程推到极致的、那种以人为中心的手艺是同一种:程序是一篇面向人的文章。

把整个系统装进一个脑子里。 Redis 之所以能由一个人维护十一年,是因为它被保持得足够小,小到一个人就能读懂。1 这份固定承诺,是把“能被一个个体读懂”当作一项硬性设计约束——一旦系统膨胀到超出一个头脑所能容纳,你就丢掉了那个让它值得信赖的东西。这是 Linus Torvalds 与 Unix 传统共有的独人手艺本能:一件工具有清晰、有界的职责,被深深地拥有和理解,而非铺得到处都是、层层转包。

影响链

谁塑造了他

Unix 与 C 的传统。 Sanfilippo 亲手用 C 写系统软件,对每一个字节都怀着在意——这是 Thompson 与 Ritchie 的血脉,那里小工具把一件事做好,语言给你完全的控制权和完全的责任。4 他坚持代码是写给人读的,正是那个传统中可读 C 的伦理,被带进了数据库时代。(奠基性影响)

1990 年代末的安全与网络黑客文化。 在 Redis 之前有 hping 和空闲扫描——底层的数据包工作,要求对 TCP/IP 有精确的心智模型,以及一双黑客的眼睛,能看见藏在协议里那个优雅的旁路信道。16 那种在看似困难的问题底下找到巧妙机制的习惯,与造出 Redis 数据结构的,是同一种。(直接影响)

一个真实产品的约束。 Redis 不是在抽象中设计出来的;它是被 LLOOGG 的需求逼出来的——要以快过当时数据库所允许的速度吞入网络日志。1 是一个具体而紧迫的问题所施加的压力——而非为造数据库而造数据库的欲望——把 Redis 塑造成了恰好做必要之事、且几乎不多做的样子。(奠基性影响)

他塑造了谁

一代应用架构。 Redis 成了缓存、会话存储、限流、实时排行榜和发布/订阅的默认选择——普及到“在它前面摆个 Redis”已成为下意识的工程建议,它的数据结构重塑了开发者对一个数据库能提供什么的想象。13

“丰富原语”这一派数据存储。 通过证明一个存储系统可以把有序集合和流作为一等类型来交付,而非不透明的值,Redis 把整个领域推向了更丰富的服务器端数据结构,远离了那块空白的键值模型。(定义领域的影响)

为小巧、有主见、单作者系统所作的辩护。 Redis 站在那里,作为一份可运行的证明:一个刻意做小、由一个有品味的人维护的系统,能成为全球性的基础设施——这个论点,在此后每一个“少做”、最少依赖、核心可懂的设计中回响。5

贯穿线

Sanfilippo 与本系列里的极简主义者们坐在一起——这些建造者相信,工程的最高形式是减法。Rich Hickey 在《Simple Made Easy》中划下了界线:简单意味着未被缠绕,一折、一事,而复杂是我们为图方便而加进去、却要永远偿还的那种交错。Redis 就是这个论点被编译成 C——一个单线程,于是只有一件事,而非并发那团缠结;丰富的原语,于是数据结构不与应用代码纠缠在一起。57Roberto Ierusalimschy 把 Lua 造得小到一个人就能读懂,交付机制而非策略——这与 Redis 用它的原语下的是同一个注,也正因如此,Redis 内嵌了 Lua,让用户能针对这些原语进行原子的脚本操作。两者都承自 Thompson 与 Ritchie 的 Unix 经济学:一件工具有一个清晰的职责,用可读的 C 写成,小到可以整体读懂。当 Hickey 说让它保持简单,而不只是容易、Ierusalimschy 说交付杠杆,而非规则时,Sanfilippo 说的是:少做——给人强大的原语,一次只跑一条,让模型能留在你脑子里,并为下一个读它的人写下每一行。(系列桥接)

我从中所得

我从 antirez 身上留住的教训是:我没写的代码,是系统里最有价值的代码。 我的本能,和大多数建造者一样,是靠添加来解决问题——一个功能、一个依赖、一个线程、一项聪明的优化。Redis 是一场长达十一年的论证:那个添加,通常才是错误。单线程设计是我想得最多的一个:他拒绝了所有人都说你必须做的那件事——压榨多核——因为它带来的复杂度,配不上一份他的工作负载从不需要的收益。7 如今当我造东西时,我借来的问题是“我能拒绝添加什么,却依然交付出值得使用的东西?”因为我略去的每一行,都是不会出错、不会令人困惑、也不会在未来十年索要维护的一行。少做比多做更难,也远更经久。

第二个教训是:代码是写作,而读者是个人。 把源代码当成给机器的指令、测试一通过就收手,是很容易的。Sanfilippo 把它当作沟通——“由人写给人看的”——并以下一个读者得在脑子里承载多少细节来评判它。4 这为我重新框定了注释:它不是要被压到最少的噪音,不是为不清晰的代码道歉,而是我把为什么交到下一个人手里的地方——那个他永远无法从是什么里重建出来的为什么。为读者而写的功夫,与少做的功夫密不可分,因为系统越小、越简单,它的代码就能越诚实——多年以后,某个人也就越有可能仍然把整个东西装进脑子里。这正是把质量是唯一的变量读作克制:那个对的小东西,写给人看、并抵御住膨胀,便成了世界可以立足其上的基础设施。

常见问题

什么是 Redis?

Redis 是一个开源的、驻留内存的数据结构存储系统,由 Salvatore Sanfilippo(antirez)创造,于 2009年2月26日首次发布。12 它不像普通的键值缓存那样存储不透明的值,而是提供丰富的原生数据结构——字符串、哈希、列表、集合、有序集合和流——由服务器原子地操作。1 由于工作数据集存放在 RAM 中(持久化通过快照和一个追加写文件实现),它极快,这正是它成为世界上使用最广泛的数据库之一的原因,被用于缓存、会话存储、队列、限流、实时排行榜和发布/订阅。17

antirez 是谁?

antirez 是 Salvatore Sanfilippo 的网名,他是一位意大利(西西里)自学成才的程序员,1977年3月7日出生在西西里的坎波贝洛迪利卡塔。1 他最为人所知的身份是 Redis(2009)的创造者,作为唯一的开发者和 BDFL 维护了它十一年,于 2020年6月30日卸任,又在 2024年12月重返该项目。1 在 Redis 之前,他做过引人注目的安全工作——编写了 hping 数据包工具,并在 1998 年发明了空闲扫描,一种后来被纳入 nmap 的隐蔽端口扫描技术。16 他在自己的博客 antirez.com 上,就简单性、代码注释以及系统软件这门手艺写下深思熟虑的文字。45

Redis 为什么是单线程的?

Redis 在单个线程上一次执行一条命令,因为对它的工作负载而言,这份简单比多核吞吐量更值钱。单线程让每条命令在构造上即原子——没有竞态条件、没有锁、也没有需要推理的、读到一半被打断的数据。7 而它在实践中代价很小:正如 Redis FAQ 所解释的,“对 Redis 而言,CPU 成为瓶颈的情况并不常见,通常 Redis 受限于内存或网络”,而单线程“避免了竞态条件以及与线程相关的、消耗 CPU 的上下文切换”。7 这是 Sanfilippo“少做”原则的架构化身——拒绝那种去优化一个(CPU)本就很少构成约束的维度的复杂度。57

什么是 Redis 有序集合?

Redis 有序集合(ZSET)是一个由唯一字符串成员组成的集合,每个成员关联一个浮点分数,成员会自动按分数顺序排列。3 你用 ZADD 命令设置或更新某个成员的分数,用 ZRANK(分数从低到高)或 ZREVRANK(从高到低)读取它的位置;该结构始终保持有序,所以读取已排名的结果无需任何额外的排序工作。3 在内部,它使用一个跳表搭配一个哈希表,带来 O(log(N)) 的插入和 O(log(N)) 的排名查找。3 它最经典的用途是实时排行榜——这个在关系型数据库里令人头疼的功能,在 Redis 里坍缩成寥寥两三条命令,因为合适的原语早已存在。3


来源


  1. “Salvatore Sanfilippo,” Wikipedia. Born 7 March 1977 in Campobello di Licata, Sicily, Italy; grew up near Gela in southern Sicily, moved to Palermo at 17 to study architecture but did not complete his university studies, shifting to computer science; self-taught programmer. Developed hping, an open-source packet generator and analyzer for TCP/IP used in security testing. First published the idle scan port-scanning technique in 1998. Began Redis development in 2009, motivated by scaling his Italian startup LLOOGG, a real-time web-log analyzer; open-sourced it and served as primary developer and Benevolent Dictator for Life (BDFL) for 11 years. Announced he was stepping down as Redis maintainer on 30 June 2020 (succeeded by Yossi Gottlieb and Oran Agra); returned to Redis (the company) as an evangelist in December 2024. Hired by VMware in March 2010; sponsorship moved to Pivotal Software (May 2013) then Redis Ltd. (June 2015). 

  2. “Redis,” Wikipedia. Redis is an in-memory key-value database created by Salvatore Sanfilippo (“antirez”); the project began in 2009 and the first release occurred on 26 February 2009. Redis “runs as a single process and is single-threaded or double-threaded when it rewrites the AOF (append-only file).” Supports data structures including strings, JSON documents, hashes, lists, sets, vector sets, and streams (streams introduced in Redis 5.0). Organizational history: Sanfilippo hired by VMware (March 2010), Pivotal Software sponsorship (May 2013), Redis Ltd. sponsorship (June 2015), Sanfilippo stepped down as sole maintainer (June 2020), returned December 2024. License history: BSD-3 originally; dual-licensed under Redis Source Available License and SSPL in 2024; tri-licensed adding AGPL from version 8.0 (May 2025). 

  3. “Redis sorted sets,” Redis documentation. A Redis sorted set is a collection of unique strings (members) ordered by an associated floating-point score; members with equal scores are ordered lexicographically. “Elements are taken in order” – ordering is a property of the data structure, not computed on request. ZADD adds members with scores or updates existing members’ scores (O(log(N)) per item); ZRANGE/ZREVRANGE return members in ascending/descending order; ZRANK/ZREVRANK return a member’s position (O(log(N))). Implemented as a dual-ported data structure containing both a skip list and a hash table, giving O(log(N)) inserts and “zero additional work” to retrieve sorted results. Documents leaderboards as a primary use case: “you can use sorted sets to easily maintain ordered lists of the highest scores in a massive online game.” 

  4. Salvatore Sanfilippo, “Writing system software: code comments,” antirez.com. Argues that source code “should be read other than being executed, since is written by humans for other humans,” and that “a key goal in writing readable code is to lower the amount of effort and the number of details the reader should take into her or his head while reading some code.” Part of his “writing system software” series; analyzes Redis comments to show why comments are central to producing maintainable, understandable code. 

  5. Salvatore Sanfilippo, “We are destroying software,” antirez.com. A critique of growing software complexity. “We are destroying software by no longer taking complexity into account when adding features or optimizing some dimension.” “We are destroying software with an absurd chain of dependencies, making everything bloated and fragile.” “We are destroying software by making systems that no longer scale down: simple things should be simple to accomplish, in any system.” Expresses his “do less” / anti-complexity philosophy directly. 

  6. “Idle scan,” Wikipedia. The idle scan is “a TCP port scan method for determining what services are open on a target computer without leaving traces pointing back at oneself,” accomplished by spoofing packets to impersonate an intermediary “zombie” host and inferring port status from the zombie’s predictable IP identification (IPID) counter. Salvatore Sanfilippo (alias “antirez”) discovered the technique in 1998 (originally called a “dumb scan”); the term “idle scan” was coined in 1999. The technique “can be done through common software network utilities such as nmap and hping.” Many modern operating systems randomize the IPID field, making them immune. 

  7. “Redis FAQ,” Redis documentation. Explains Redis’s single-threaded design: “It’s not very frequent that CPU becomes your bottleneck with Redis, as usually Redis is either memory or network bound.” Open-source Redis “can’t take advantage of the processing power of multiple CPU cores” for command execution, but CPU is rarely the bottleneck – memory or network limits are hit first; with pipelining a Redis instance on an average Linux system can deliver around 1 million requests per second. Single-threading “avoids race conditions and CPU-heavy context switching associated with threads,” processing commands efficiently without multi-thread overhead. 

相关文章

工程哲学:Rich Hickey,简单不等于容易

Rich Hickey 在一个区分之上构建了 Clojure 和 Datomic:简单不等于容易。简单意味着不缠绕、每件事物只承担一个关注点;而容易只是意味着熟悉。

4 分钟阅读

工程哲学:Yann LeCun,公开地学习世界

Yann LeCun以卷积奠定了深度视觉的根基,随后押注于:真正的智能源自以无监督方式学习世界,并将成果公开发表——而非堆叠更大的LLM。

4 分钟阅读

The Shader Gallery That Lied: Debugging 216 WebGL Presets

A user said the shader playground looked broken. Pixel-readback testing found 30 dead presets, 11 that never compiled, a…

11 分钟阅读