エンジニアリング哲学:Salvatore Sanfilippo(antirez)

要点
- 彼を貫く原則は「やることを減らす」――頭の中に収まる小さくシンプルなシステムは、大きく機能を盛り込んだものに勝ります。 オンライン上では antirez として知られるSalvatore Sanfilippoは、Redisを意図的に小さなストアとして設計しました。シングルスレッドで、インメモリ、整然としたCで書かれ、理解を難しくするような機能の追加を徹底して拒みます。彼のエッセイは何度も同じ的を射抜きます――コストを数えずに足してしまう複雑さ、という的を。15
- 彼は2009年にRedisを生み出し、それは世界で最も使われるデータベースの一つになりました。 インメモリのデータ構造ストアであるRedisは、2009年2月26日 に初めてリリースされました。リアルタイムのWebログ解析ツールであるイタリアのスタートアップLLOOGGをスケールさせようとした試みから生まれたものです。彼は11年にわたり、唯一のメンテナであり「慈悲深い終身独裁者(BDFL)」を務めました。12
- Redisは設計としてシングルスレッドであり、それこそが特長です。 マルチコアのスループットを追い求めるのではなく、Redisは一つのスレッド上でコマンドを一度に一つずつ実行します――これにより競合状態やロックのオーバーヘッドがなくなり、モデルはシンプルに保たれます。それでも十分に速いのです。なぜなら、RedisのFAQが言うように「RedisでCPUがボトルネックになることはあまり多くありません。たいていRedisはメモリかネットワークのいずれかに律速されるからです」。7
- 彼はコードを、人間が他の人間のために書くものとして扱います。 「Writing system software」のエッセイの中で彼は、ソースは「実行されるためというより読まれるためのものであり、人間が他の人間のために書くのだ」と論じ、読みやすいコードの目的は「読み手が頭の中に抱え込むべき労力と細部の量を減らすこと」だと述べています。4
原則
「私たちは、機能を追加したり何かの次元を最適化したりするときに複雑さをもはや勘定に入れなくなったことで、ソフトウェアを壊している……私たちは、ばかげた依存の連鎖によってすべてを肥大化させ脆くすることで、ソフトウェアを壊している……私たちは、もはやスケールダウンしないシステムを作ることで、ソフトウェアを壊している。単純なことは、どんなシステムであれ、単純に達成できるべきなのだ」――Salvatore Sanfilippo「We are destroying software」5
エンジニアリングの大半は足し算です。機能が求められれば、足す。ある依存を入れれば一週間節約できるなら、引っ張ってくる。ある最適化が一人のユーザーの役に立つなら、コアに焼き込む。一歩一歩は局所的には理にかなって見えます――けれどもその総和は、もはや誰一人として頭の中に収めきれないシステムになります。Sanfilippoの直感は逆方向に走ります。彼の哲学において最も危険なコードとは、そもそも書かずに済ませられないかをまず問わずに書いてしまう一行なのです。やることを減らす。 問いは決して「これにあと何ができるか」ではなく、「何をやめても、なお使う価値があるか」なのです。5
この原則を最も鮮やかに体現しているのが、Redisそのものです。Redisはコマンド実行において シングルスレッド です――この選択は、業界がこぞってマルチコアを使い切ろうと競っていた2009年には、ほとんど天邪鬼にすら見えました。17 けれどもその理由づけは、原則をそのままアーキテクチャに翻訳したものです。一度に一つのコマンドを実行する単一のスレッドには、競合状態も、ロックも、読み取りの破綻も、二つのスレッドが同じキーを書き換えるバグもありません。頭の中のモデルは、人間が実際に推論できる程度にまで縮みます――コマンドは順番に、一つずつ、アトミックに起こる、と。そして実用上、失うものはほとんどありません。なぜならRedisは、CPUが限界になるよりずっと手前で「メモリかネットワークのいずれかに律速される」からです。7 並行処理という複雑さは、大半のワークロードが必要としない便益のためにantirezが払うことを拒んだコストでした。
その拒絶には、それを払う価値のあるものにする二つの相棒が連れ立っています。一つ目は 豊かなプリミティブ です。あらゆる問題を単一のキー・バリューのモデルに押し込むのではなく、Redisは文字列、ハッシュ、リスト、セット、ソート済みセット、ストリームをネイティブのデータ構造として備えています。だから適切な道具はたいてい最初から箱の中にあるのです。1 二つ目は 人間のために書かれたコード です。彼はソースが「人間が他の人間のために書くもの」であり、良いコードは「読み手が頭の中に抱え込むべき細部の量」を減らすのだと言い張ります。4 少数の強力なプリミティブを人々に渡し、求められたより少なくやり、その全体を一人でなお理解できるように書く。 それが原則であり、Redisがその証明なのです。
背景
Salvatore Sanfilippoは 1977年3月7日、イタリア・シチリア島のカンポベッロ・ディ・リカータ で生まれました。1 シチリア島南部のゲーラ近郊の周縁的な地域で育ち、17歳でパレルモへ移って建築を学びました――けれどもその学位を修めることはなく、関心をコンピューターサイエンスへ移し、ほとんど独学でプログラミングを身につけました。1 ここで覚えておくに値する事実は、彼が 独学 であり、大学のCS学位を修めていないということです。技は資格ではなく、実際に手を動かすことから得られたものでした。それはこのシリーズで繰り返し現れる形です――その権威が、教わったことではなく、築いたものに支えられている、深い実践者という形が。
彼がこの分野に最初に刻んだ印は、データベースではなくセキュリティにありました。彼はセキュリティテストに用いられるTCP/IPプロトコル向けのオープンソースのパケット生成・解析ツール hping を書きました。1 さらに重要なことに、1998年に彼はidle scanを発表しました――もともと「dumb scan」と呼ばれたステルス型のポートスキャン技法で、「自分へ遡る痕跡を残さずに」標的でどのサービスが開いているかを判定するものです。6 これはサイドチャネルを突くことで成り立ちます。予測可能なIP IDカウンターを持つアイドル状態の第三者「ゾンビ」ホストを、攻撃者がブラインドのプロキシとして使い、標的の応答を推論するのです。6 この技法は十分に巧妙で、nmapとhpingに組み込まれ、今もそこに残っています。6 それは後にRedisを定義づけたのと同じ直感です――一見難しい問題の下に隠れている、優美な仕組みを見つけ出すという直感です。
Redis自体は、実際的なスケーリングの問題から生まれました。2000年代後半、SanfilippoはリアルタイムのWebログ解析ツールを作るイタリアのスタートアップ LLOOGG を運営しており、既存のデータベースは彼が必要とする書き込みレートに追いつけませんでした。1 そこで2009年、彼は自前のインメモリストアを作り、2009年2月26日にRedisをリリースしました。12 それは急速に広まり、スポンサーシップもその台頭を追いかけました。VMwareが2010年3月に彼を雇用し、VMwareからスピンオフした Pivotal Software が 2013年5月 にスポンサーシップを引き継ぎ、Redis Ltd. が 2015年6月 にそれを担いました。1 彼は11年にわたってプロジェクトの唯一のメンテナであり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))で、セットはすでにソート済みなので、上位10件を読み出すのは些細なことです。3 この機能が楽になったのは、Redisが同じ作業を速くこなすからではありません――その形 そのものが 解になっているプリミティブを、Sanfilippoが備えることを選んだからです。それはユーザー側から見た「やることを減らす」です。データベースが難しい部分を一度だけ引き受けたので、千のアプリケーションが二度とそれをやらずに済むのです。
シングルスレッドかつインメモリ――設計の中心としての単純さ
Redisは、制約のように見えて実はその強さの源である二つの選択をしています。インメモリ であること――作業データはRAMに住み、耐久性はスナップショットと追記専用ファイルによって上に重ねられます――そしてコマンド実行において シングルスレッド であること、すなわち単一のコア上でリクエストを一度に一つずつ処理することです。17 どちらの選択も、姿を変えた「やることを減らす」なのです。
シングルスレッドの決断のほうがより直感に反していて、その理由づけは追いかける価値があります。マルチスレッドのストアは、共有データへの並行アクセスを調停しなければなりません――ロック、アトミック操作、ロックフリー構造、メモリバリア――そしてその仕掛けこそ、データベースのバグと予測不能なレイテンシのぞっとするほど大きな割合が住みつく場所です。一度に一つのコマンドを実行することで、Redisはすべてのコマンドを 構造的に アトミックにします。推論すべきインターリーブはなく、忘れるべきロックもなく、デバッグすべき競合もありません。7 公式FAQは、なぜこれがほとんどコストにならないのかを率直に述べています。「RedisでCPUがボトルネックになることはあまり多くありません。たいていRedisはメモリかネットワークのいずれかに律速されるからです」、そしてシングルスレッド化は「スレッドにつきまとう競合状態とCPU負荷の高いコンテキストスイッチを避けます」。7 この設計が手放すスループットは、大半のワークロードがそもそも使うはずのなかったスループットです。一方、それが買い取る単純さは、あらゆるコード行と、午前3時のあらゆるデバッグの場面で報われます。
これはエッセイの中で複雑さを足すことを拒む、彼のあの一徹さと同じ気質です。彼は失敗の型を正確に言い当てます。「私たちは、機能を追加したり何かの次元を最適化したりするときに複雑さをもはや勘定に入れなくなったことで、ソフトウェアを壊している」。5 マルチスレッド化はまさにその種の最適化です――一つの次元、すなわち生のCPUスループットの最適化のために、大半のユーザーが必要としなかった便益と引き換えに、システムの複雑さを何倍にもしたであろうものなのです。それにノーと言ったことが、Redisを一人の人間が頭の中に収められるシステムに保ちました。そしてそれこそが、一人の人間が11年にわたって保守できた理由となった性質なのです。1

技――人間のために書かれたC、そしてコメントの擁護
三つ目の仕事の本体は、機能ではなく、コードをどう書くべきかという姿勢です。SanfilippoはRedisを C で書きます――ガードレールのない言語で、プログラマーが一バイト一バイトに責任を負う言語です――そして、そのCの読みやすさを、後回しにすべき些事ではなく一次的な関心事として扱います。彼のエッセイ「Writing system software: code comments」は、ソースが何よりもまず コミュニケーション として存在するのだという、異例なほど直截な主張です。コードは「実行されるためというより読まれるためのものであり、人間が他の人間のために書くのだ」と彼は記します。4 実行される振る舞いは仕事の半分にすぎません。もう半分は、それを理解しなければならない次の人――しばしば未来の自分自身――なのです。
その前提から、彼はコメントと明晰さに関する一つの実用理論を導きます。読みやすいコードの目的は「コードを読むとき、読み手が頭の中に抱え込むべき労力と細部の量を減らすこと」だと彼は論じます。4 コメントがその居場所を勝ち得るのは、読み手がさもなければ自力で再構築しなければならない細部を取り除くときです――自明でない選択の背後にある なぜ、関数が前提とする不変条件、高速経路が存在する理由。これは最も深い意味での技です。小手先の賢さではなく、後から来る人間への気遣いです。それは「やることを減らす」原則とぴたりと対になります。システムが小さくシンプルであるほど、抱えるべき細部は少なくなり、残った細部についてコードはより正直になれるからです。

同じ確信が、ソフトウェアの行く先に対する彼のより広い批判を駆動します。彼は「すべてを肥大化させ脆くする、ばかげた依存の連鎖」に対して、そして「もはやスケールダウンしないシステム――単純なことは、どんなシステムであれ、単純に達成できるべきだ」に対して、警鐘を鳴らします。5 Redisは、実行可能なものにされた彼の反論です――依存が少なく、小さく理解可能なコアを持ち、単純なことが単純なままでいる設計です。技はエンジニアリングの上に乗った装飾ではありません。それ こそが エンジニアリングなのです。
手法
Redis、idle scan、コメントと複雑さについてのエッセイ、そしてあの単一のスレッドを横断して読むと、同じ約束事が繰り返し現れます。Sanfilippoの手法は、スローガンというよりは、一連の不変の習慣です。
やることを減らす――最も危険なコードは、書く必要のなかったコードである。 彼を定義づける習慣は引き算です。機能や、依存や、最適化を足す前に、システムがそれなしで生き延びられるかを問うのです。彼は失敗の型を直截に名指します――「勘定に入れずに」足される複雑さ、と。5 その教訓はデータベースをはるかに越えて転移します。書かずに済ませた一行は、壊れることも、次の読み手を惑わせることも、十年にわたって保守され続けることもない一行なのです。それはシステムのコアという水準での 最小限の価値ある製品 です――本当に使う価値のある最小のものを出荷し、成長を迫る絶え間ない圧力に抗してその小ささを守るのです。
作り込まれた方針ではなく、強力なプリミティブを出荷する。 Redisはソート済みセット、ストリーム、ハッシュを渡します――リーダーボード、キュー、レート制限をそこから組み立てるための汎用的な構造を――それぞれに専用の機能をあつらえる代わりに。3 その不変の習慣は、ある問題群の全体を解く根底の仕組みを見つけ出し、それを 出荷することです。そうすればデータベースが難しい部分を一度だけ引き受けます。それは Roberto Ierusalimschy がLuaのテーブルとメタテーブルで賭けたのと同じ賭けです――鋭く汎用的なてこを人々に渡し、残りは彼らに組み立てさせる――そしてその血縁は偶然ではありません。RedisはまさにそれをするためにLuaを組み込んでいるのですから。
スループットを犠牲にしてでも単純さを選ぶ。 シングルスレッドの設計が最も明快な例です。Redisはコマンド実行においてマルチコアの並列性を辞退します。なぜなら、その単純さ――競合なし、ロックなし、構造的にアトミック――がコアよりも価値があり、そもそもCPUがボトルネックになることは稀だったからです。7 その規律は、実際に自分を律しているのはどの次元なのかを知り、律していない次元を最適化するために複雑さを払うことを拒むことです。これは性能に適用された 証拠のゲート です――速そうに聞こえるからといって並行処理を足してはいけません。ボトルネックが本当はどこにあるのかを測るのです。そしてたいていの場合、それはCPUではありません。
次にそれを読む人間のためにコードを書く。 ソースは「人間が他の人間のために書くもの」であり、コメントの仕事は読み手が抱えるべき細部を減らすことです。4 その習慣は、読みやすさと説明的なコメントを、後で足す嗜みではなく正しさの一部として扱うことです――なぜなら、誰も理解できないシステムは、誰も安全に変更できないシステムだからです。それは Donald Knuth が文芸的プログラミングで極限まで推し進めた、同じ人間中心の技です――プログラムは、人に向けて書かれた一篇の文章なのです。
システム全体を一つの頭の中に収める。 Redisが11年にわたって一人の人間に保守可能であり続けたのは、一人の人間に理解可能なほど小さく保たれていたからです。1 その不変の約束は、個人による理解可能性を厳格な設計上の制約として扱うことです――システムが一つの頭の収められる範囲を越えて成長すれば、それを信頼に足るものにしていたものを失ってしまうのです。それは Linus Torvalds とUnixの伝統が共有する、孤独な手仕事の直感です――明確で境界の定まった仕事を持つ道具を、広がり散らして委ねるのではなく、所有し深く理解するという直感です。
影響の連鎖
彼を形づくった者たち
UnixとCの伝統。 Sanfilippoはシステムソフトウェアを、手で、一バイト一バイトに気を配りながら、Cで書きます――小さな道具が一つのことをうまくこなし、言語が完全な制御と完全な責任を与える、ThompsonとRitchie の系譜です。4 コードは人間が読むために書かれるという彼の主張は、その伝統の読みやすいCの倫理を、データベースの時代へと携えてきたものです。(形成的な影響)
1990年代後半のセキュリティとネットワークのハッカー文化。 Redisの前にはhpingとidle scanがありました――TCP/IPの精密なメンタルモデルと、プロトコルに隠れた優美なサイドチャネルを見抜くハッカーの眼を要求する、低レベルのパケット仕事です。16 一見難しい問題の下に潜む巧妙な仕組みを見つけ出すその習慣は、Redisのデータ構造を生み出したのと同じものです。(直接的な影響)
現実の製品という制約。 Redisは抽象の中で設計されたのではありません。既存のデータベースが許す以上に速くWebログを取り込むという、LLOOGGの必要によって生み出されざるを得なかったのです。1 具体的で切迫した問題の圧力――データベースをそれ自体のために作りたいという欲求ではなく――こそが、まさに必要なことだけを、それ以上はほとんど何もしないという方向へRedisを形づくったのです。(形成的な影響)
彼が形づくった者たち
ある世代のアプリケーションアーキテクチャ。 Redisはキャッシュ、セッションストレージ、レート制限、リアルタイムのリーダーボード、pub/subのデフォルトになりました――あまりに遍在しているので「とりあえずRedisを前に置け」が反射的なエンジニアリングの助言になるほどで、そのデータ構造は、データベースに何を求められるかについての開発者の考え方を作り替えました。13
「豊かなプリミティブ」派のデータストア。 ストアが不透明な値ではなくソート済みセットやストリームを第一級の型として出荷できることを証明したことで、Redisはこの分野全体を、より豊かなサーバーサイドのデータ構造へと、空白のキー・バリューのモデルから遠ざかる方向へと押しやりました。(分野を定義づける影響)
小さく、意見を持ち、単独の作者によるシステムの擁護。 Redisは、意図的に小さなシステムが――美意識を備えた一人の人間に保守されながら――世界的なインフラになりうることの、生きた証として立っています。それは、それ以来のあらゆる「やることを減らす」、最小依存、理解可能なコアの設計を通じて響く論証です。5
貫く一本の線
Sanfilippoはこのシリーズのミニマリストたち――エンジニアリングの最高の形は引き算だと信じる作り手たち――と席を並べます。Rich Hickey は「Simple Made Easy」でその線を引きました――シンプルとは 撚り合わされていない こと、一つの折り目、一つの関心であり、複雑さとは私たちが便宜のために足し、その後ずっと払い続けるインターリーブだ、と。Redisはその論証をCにコンパイルしたものです――関心が一つになるよう単一のスレッドにし、並行処理の撚り合わせを避ける。データ構造がアプリケーションコードと絡まないよう豊かなプリミティブを備える。57 そして Roberto Ierusalimschy は、一人の人間が理解できるほど小さくLuaを築き、方針ではなく仕組みを出荷しました――それはRedisがそのプリミティブで賭けるのと同じ賭けであり、だからこそRedisはユーザーがそれらに対してアトミックにスクリプトを書けるよう、Luaを組み込んでいるのです。両者はともに ThompsonとRitchie のUnixの倹約に連なります――一つの明確な仕事を持ち、読みやすいCで書かれ、全体を理解できるほど小さな道具に。Hickeyが 単に楽にするのではなく、シンプルに保て と言い、Ierusalimschyが 規則ではなく、てこを出荷せよ と言うところで、Sanfilippoはこう言います――やることを減らせ。強力なプリミティブを人々に渡し、モデルが頭の中に収まるよう一度に一つずつ実行し、次にそれを読む人間のために一行残らず書け と。(シリーズの架け橋)
私がここから受け取るもの
antirezから私が手放さずにいる教訓は、書かないコードこそ、システムの中で最も価値あるコードだ ということです。私の直感は、大半の作り手と同じく、問題を足し算で解こうとします――機能を、依存を、スレッドを、巧妙な最適化を。Redisは、その足し算がたいてい間違いなのだという、11年がかりの論証です。私が最もよく考えるのはシングルスレッドの設計です。彼は、誰もがやらねばならないと言ったこと――コアを使い切ること――を辞退しました。それがもたらす複雑さが、彼のワークロードが決して必要としなかった便益に見合わなかったからです。7 今、私が何かを作るとき、借りてくる問いはこうです――「何を足さずに済ませても、なお使う価値のあるものを出荷できるか」。なぜなら、省いた一行はどれも、壊れることも、惑わせることも、次の十年にわたって保守を要求することもない一行だからです。やることを減らすのは、やることを増やすより難しく、そしてはるかに長持ちします。
二つ目の教訓は、コードは文章であり、読み手は人間だ ということです。ソースを機械への命令として扱い、テストが通った瞬間に手を止めるのは簡単です。Sanfilippoはそれをコミュニケーションとして扱い――「人間が他の人間のために書く」もの――次の読み手が頭の中に抱えなければならない細部がいかに少ないかで、それを評価します。4 それは私にとってコメントを捉え直させました――最小化すべき雑音ではなく、不明瞭なコードへの詫びでもなく、何を するかからは決して再構築できない なぜ を、次の人へ手渡す場所として。読み手のために書く規律は、やることを減らす規律と切り離せません。なぜなら、システムが小さくシンプルであるほど、そのコードはより正直になれるからです――そして、何年も先の一人の人間が、なお全体を頭の中に収められる見込みが高くなるからです。それは 品質こそが唯一の変数だ を、自制として読んだものです――正しい小さなもの、人間のために書かれ肥大化に抗して守られたものが、世界がその上に立てるインフラになるのです。
FAQ
Redisとは何ですか?
Redisは、Salvatore Sanfilippo(antirez)が作り、2009年2月26日に初めてリリースされた、オープンソースのインメモリのデータ構造ストアです。12 ただのキー・バリューキャッシュのように不透明な値を保存するのではなく、豊かなネイティブのデータ構造――文字列、ハッシュ、リスト、セット、ソート済みセット、ストリーム――を備え、それらをサーバーがアトミックに操作します。1 作業データはRAMに住む(耐久性はスナップショットと追記専用ファイルによる)ため、きわめて高速です。だからこそ、キャッシュ、セッションストレージ、キュー、レート制限、リアルタイムのリーダーボード、pub/subの用途で、世界で最も広く使われるデータベースの一つになったのです。17
antirezとは誰ですか?
antirezは、Salvatore Sanfilippoのオンライン上のハンドルネームです。1977年3月7日にシチリア島のカンポベッロ・ディ・リカータで生まれた、イタリア人(シチリア人)の独学プログラマーです。1 Redis(2009年)の作者として最もよく知られ、唯一の開発者でありBDFLとして11年間それを保守したのち、2020年6月30日に退き、2024年12月にプロジェクトへ戻りました。1 Redisの前には注目すべきセキュリティの仕事を残しています――hpingというパケットツールを書き、1998年にはidle scanという、後に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
出典
-
“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). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩
-
“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). ↩↩↩
-
“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.” ↩↩↩↩↩↩↩↩↩↩↩
-
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. ↩↩↩↩↩↩↩↩
-
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. ↩↩↩↩↩↩↩↩↩↩
-
“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. ↩↩↩↩↩
-
“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. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩