- Redis は、高度な構造とアトミック操作を使用してメモリにデータを保存します。
- 永続性 (RDB/AOF)、非同期レプリケーション、Pub/Sub や Lua などのツールをサポートします。
- 非常に低いレイテンシでのキャッシュ、セッション、メッセージング、ランキングに最適です。
アプリケーションをロケットのように高速に動作させたいと思ったことがあるなら、Redisについて聞いたことがあるでしょう。この技術は、インメモリデータシステムとして機能し、 非常に低いレイテンシとほぼ瞬時の応答速度が絶対的に優先される場合に最適です。
Redisは単なるキャッシュにとどまらず、複数のデータ構造と統合ツールを備えたキーバリュー型NoSQLデータベースです。2009年にC言語で開発され、その名前は「Remote Dictionary Server(リモート辞書サーバー)」に由来しています。現在では、非常に活発なエコシステム、ほぼすべてのプログラミング言語に対応したクライアント、そして堅牢な永続化およびレプリケーション機能を誇っています。
Redis とは何ですか? 何に使用されますか?
Redisは、キーと値のペアや高度な構造を扱うインメモリストレージエンジンです。RAM上で動作することで、ディスクアクセスにありがちなボトルネックを軽減し、高速処理が求められるユースケースに最適です。例えば、大量のクエリのキャッシュ、ユーザーセッション、リアルタイムメッセージング、オンラインゲーム、ストリーミングデータを含むダッシュボードなどです。
多くのプロジェクトでは、従来のデータベースの前面に配置されたキャッシュ層として使用され、繰り返し発生する結果を保存することで、継続的な再計算や再クエリを回避します。また、厳密な永続性が求められない場合や、データがディスクに保存されるように永続化が構成されている場合は、データベース自体としても使用されます。
クライアント/サーバーアーキテクチャ、ネットワークインターフェース、軽量設計により、複数のホストからのデプロイと接続が容易です。さらに、非同期マスター・レプリカ方式(マスターはレプリケーション中も動作を継続)を採用しているため、読み取り処理のスケーラビリティ向上と可用性の向上に貢献します。
主な特徴
Redisの最大の強みは、すべてのデータがメインメモリに格納される点です。これにより、クリティカルパス中のディスクアクセスが排除され、非常に高速な読み書き操作が可能になります。さらに、各文字列は最大512MBまで拡張可能で、バイナリデータにも対応しています。また、リスト、セット、ソート済みセット、ハッシュ、HyperLogLog、ビットマップ、ストリームなどの構造もサポートしています。
Redisは、これらの構造体に対して高度なサーバーサイドのアトミック操作を実装しています。これにより、セットの和集合、積集合、差集合の演算、部分文字列の変更、整数や浮動小数点数の増減などを、競合状態を起こすことなく実行できます。
これには、開発を加速し、一般的なパターンを簡素化するツールが含まれています。チャネルへの公開と購読を行うためのPub/Sub(リアルタイムのメッセージングと通知に最適)、自動有効期限のためのTTL付きキー、メトリクスと同時実行制御のためのアトミックカウンター、そしてバージョン2.6以降ではサーバーサイドロジック用のLuaスクリプトの組み込みサポートなどです。
もう一つの大きな利点は、モジュールとの互換性です。Redisモジュールは、JSONドキュメント、時系列データ、検索などの機能を拡張し、単純なキーと値のペアリングをはるかに超えた、汎用性の高いシステムを実現します。

歴史、ライセンス、進化
Redisは、LLOGGという製品のレイテンシを改善するために、2009年にサルヴァトーレ・サンフィリッポによって開発されました。その成功はすぐに訪れ、2010年にはVMwareがサンフィリッポをプロジェクトの専任リーダーとして採用しました。その後まもなく、ピーター・ノールトハイスが加わりました。2013年から2015年まではPivotal、その後はRedis Labsがスポンサーを務めました。
バージョン2.6以降、サーバーにはLuaインタープリタが統合され、Redis内でスクリプトを直接実行してアトミック性を確保し、クライアントとサーバー間の往復遅延を最小限に抑えることが可能になりました。ライセンスに関しては、RSALv2とSSPLv1のデュアルモデルで配布されています。
データモデルと操作
Redisは、キーと値をマッピングするグローバル辞書を使用します。より単純なキーバリュー型ソリューションとは異なり、値はさまざまな型を持つことができます。型によって、使用可能なコマンドと、そのデータに対して実行できるアトミック操作が決まります。
RedisのString型は「バイナリセーフ」です。テキスト、整数、浮動小数点数、またはJPEG画像やシリアル化されたオブジェクトなどの生のバイナリデータを含めることができます。文字列の一部に対して操作を行ったり、特定のビットを変更したり、増減可能なカウンターとして使用したりできます。
リストはキューやスタックの管理に、セットと順序付きセットはメンバーシップやスコアによるランキングに、ハッシュはフィールドと値のマップを格納するのに、オブジェクトの属性をグループ化するのに非常に役立ちます。HyperLogLogはメモリ使用量を最小限に抑えながら近似的なカーディナリティカウンターを作成するのに、ストリームはグループ化された消費によるイベントフローを容易にします。
さらに、Redisはトランザクション(MULTI/EXEC)を提供しており、複数の操作をグループ化して順次かつアトミックに実行できます。Luaと組み合わせることで、複雑なサーバーサイドロジックを確実にカプセル化できます。
永続性: スナップショットとAOF
Redisは完全にメモリ上で動作することもできますが、パフォーマンスと耐久性のバランスを取るためにディスク永続化もサポートしています。スナップショット(RDB)を使用すると、データセットの定期的なスナップショットを取得し、非同期的に保存するため、応答時間への影響を最小限に抑えることができます。
もう1つのオプションはAOF(ジャーナリング)で、すべての書き込み操作をファイルに記録します。このモードでは、より細かく設定可能な耐久性が実現します。`appendfsync =always`は変更があるたびに強制的に同期を行い(セキュリティは最大限に高まりますが、パフォーマンスは低下します)、`appendfsync=everysec`は1秒ごとに同期を行います(優れたバランスです)。
必要に応じて、手動で保存を実行してスナップショットを即座に作成することもできます。マシンが完全に故障した場合でも、選択した同期ポリシーにもよりますが、通常はごく少量のデータしか失われません。
旧バージョンでは、バージョン2.4以降で「仮想メモリ」の使用が許可されていましたが、現在ではその方法は廃止されています。今日では、RDB、AOF、またはその両方を組み合わせたものを選択し、データの重要度と必要なパフォーマンスに応じて構成を調整することをお勧めします。
レプリケーションと高可用性
Redisは非同期マスター・レプリカレプリケーションを実装しています。これは、マスターへの書き込みが受け入れられ、レプリカが同期される際にマスターがブロックされないため、同期中もサービスが稼働し続けることを意味します。マスターは複数のレプリカを持つことができ、さらにレプリカは別のレプリカのマスターとして連鎖的に接続され、ツリー構造を形成します。
レプリケーションは、読み取り操作のスケーリングや冗長性の確保に非常に役立ちます。一部の構成ではレプリカへの書き込みが可能ですが、適切に制御しないと不整合が発生する可能性があります。デフォルトでは、一貫性を維持するためにレプリカは通常読み取り専用として使用されます。
ユーザーの近くにレプリカを配置することで、体感遅延を低減できます。オーケストレーションツールやセンチネル/クラスタツールを使用することで、高可用性と自動フェイルオーバーを実現し、マスター障害発生時のダウンタイムを最小限に抑えることができます。
クライアント/サーバーアーキテクチャとエコシステム
Redisサーバーは、さまざまな言語のクライアントが接続できるシンプルなプロトコルを提供します。公式のCLI(redis-cli)を使用してテスト、管理、簡単なスクリプト作成を行ったり、ライブラリをアプリケーションに統合したりできます。
ActionScript、C、C++、C#、Java、Go、Python、PHP、Ruby、Scala、JavaScript(サーバーサイドのNode.jsを含む)、R、Erlang、Haskell、Lua、Objective-C、Perl、Common Lisp、Smalltalk、Tcl、Io、haXe、Pure Dataなど、幅広い言語に対応したクライアントが用意されています。この幅広いサポートにより、ほぼあらゆるスタックで容易に導入できます。
実際の使用例と実例
よくある例として、オンライン不動産会社が挙げられます。物件の価格、設備、部屋数などの情報はほとんど変わりません。キャッシュがない場合、アクセスするたびにクエリと計算が繰り返されます。Redis を使用すると、最初の読み込み後、オブジェクトはキー (例えばproperty_4056 ) と、例えば 1 か月の TTL (有効期限) とともに保存されます。以降のアクセスではメモリから読み込まれるため、データベースへのアクセスは不要になります。
また、重いレポート結果をキャッシュしたり、認証済みセッションを管理したり、ソート済みセットを使用してリアルタイムのランキングを作成したり、サービス間の軽量なメッセージングチャネルとしてPub/Subを使用したりすることも一般的です。
16.000行のエラーテーブルを用いたテストでは、1) データベースへのクエリ、2) コレクションのRedisへの保存、3) Redisからの読み取りにかかる時間を計測しました。その結果は驚くべきもので、Redisからの取得はデータベースからの取得よりも26倍高速でした。こうした比較は、ユーザーエクスペリエンスとインフラストラクチャコストへの実際の影響を浮き彫りにすることがよくあります。
Redis と Memcached の比較
どちらの技術もインメモリキャッシュに使用されますが、顕著な違いがあります。Redisは、複数のデータ型(リスト、セット、ハッシュなど)、オプションのディスク永続化、Pub/Sub、Luaスクリプト、トランザクション、および機能を拡張するためのモジュールを提供します。一方、Memcachedは、永続化機能を持たないシンプルなインメモリキーバリューモデルに重点を置いています。
純粋なパフォーマンスという点では、どちらも非常に高速です。Redisは、複雑な構造やアトミックなサーバーサイド操作を伴うシナリオで特に優れています。非常にシンプルで超軽量なキャッシュだけが必要な場合は、Memcachedで十分かもしれませんが、より多くの機能と柔軟性を求める場合は、通常Redisが優位に立ちます。
マネージドサービスとセルフマネージドサービス(Redis と Valkey)
RedisやValkeyは、ご自身でデプロイすることも、マネージドクラウドサービスを利用することも可能です。セルフマネジメントを選択すれば完全な制御権を得られますが、スケーラビリティとメンテナンス(ノードの追加、アップデート、セキュリティ対策、バックアップ、監視など)はお客様の責任となります。
マネージドサービスを利用することで、運用上の負担が軽減されます。具体的には、スケーリングが容易になり、可用性が高く、アップデートも手間がかかりません。これにより、総所有コストが削減され、チームはプラットフォーム関連の作業ではなく、データモデリングやビジネス機能の開発に集中できるようになります。
統合ツール: Pub/Sub、TTL、カウンター、Lua
Pub/Subを使えば、メッセージをチャネルにブロードキャストし、複数の購読者が即座に受信できます。これはチャット、通知、マイクロサービス間の連携に最適です。シンプルかつ効果的なパターンです。
有効期限(TTL)キーを使用すると、セッション、トークン、期限切れのクエリ結果などの一時データを「自動的にクリーンアップ」できます。これにより、データベースに古い情報が蓄積されるのを防ぎ、有効期限管理のロジックを簡素化できます。
アトミックカウンタは、メトリクス、レート制限、キュー、または並行環境で安全に加算/減算を行う必要があるあらゆるケースに最適です。
最後に、Luaの組み込みサポートにより、スクリプトをデータに近い場所でアトミックに実行できます。これにより、ネットワークの通信量が削減され、複雑な操作を単一のステップで実行できるため、一貫性とパフォーマンスが向上します。
よくある質問
Redisは何に使われるのですか?インメモリキャッシュ、セッション、リアルタイムランキング、Pub/Subによる軽量メッセージングでアプリケーションを高速化するため、また、レイテンシが重要な場合や永続化が構成されている場合のNoSQLデータベースとして使用されます。
Redisが高速な理由は?データがRAMに格納されるため、クリティカルパス上のディスクアクセスが排除され、サーバー側の操作がアトミックになるからです。さらに、そのプロトコルは軽量かつ効率的です。
データベースとして使用できますか?はい。これは、永続化オプション(RDBとAOF)を備えたインメモリNoSQLデータベースです。構成によっては、パフォーマンスまたは耐久性を優先したり、両方を組み合わせたりすることができます。
言語サポート
Python (redis-py)、Java (Jedis)、Node.js (ioredis)、C#/.NET (StackExchange.Redis)、PHP (phpredis)、Go (go-redis)、Ruby (redis-rb)など、ほぼすべての言語に対応した成熟したクライアントが存在します。この多様性により、既存のスタックとのシームレスな統合が保証されます。
Redisは、最新のアーキテクチャにおけるパフォーマンスとリアルタイムの問題を解決するための「切り札」としての地位を確立しています。驚異的なスピード、豊富なデータ構造、構成可能な永続性、レプリケーション、そして適切に使用すればユーザーエクスペリエンスに大きな違いをもたらす一連の実用的なツールを兼ね備えています。