Redis 7 の新機能まとめ:ACL v2/I/O Threads/RESP3 を一気に把握
Redis 7 がリリースされ、エンタープライズレベルでの利用がさらに加速しています。今回のバージョンでは、セキュリティ強化、パフォーマンス向上、そして通信プロトコルの進化という 3 つの大きな柱が追加されました。
この記事では、Redis 7 の代表的な新機能である ACL v2(アクセス制御リスト v2)、I/O Threads(入出力スレッド)、RESP3(Redis シリアライゼーションプロトコル 3) について、初心者の方にもわかりやすく解説していきます。それぞれの機能がどのような課題を解決し、どう活用できるのかを具体例とともに見ていきましょう。
背景
Redis はオープンソースのインメモリデータストアとして、キャッシュやセッション管理、メッセージキューなど幅広い用途で利用されています。シンプルで高速な特性から、Web アプリケーションのバックエンドに欠かせない存在となっていますね。
しかし、システムが大規模化し複雑になるにつれて、以下のような要求が高まってきました。
- セキュリティ: 複数のチームやアプリケーションが同一の Redis インスタンスを共有する際、きめ細かいアクセス制御が必要
- パフォーマンス: CPU のマルチコア化が進む中、Redis のシングルスレッドモデルではハードウェアリソースを十分に活用できない
- プロトコル: クライアント側でのデータ型判別やメタ情報の取得に手間がかかり、開発効率が低下
以下の図は、Redis を取り巻く環境の変化を示しています。
mermaidflowchart TB
app1["アプリA"] --> redis["Redis<br/>サーバ"]
app2["アプリB"] --> redis
app3["アプリC"] --> redis
redis --> cpu["マルチコア<br/>CPU"]
redis --> net["ネットワーク<br/>I/O"]
redis -.->|従来| limit["シングルスレッド<br/>の制約"]
このように、複数のアプリケーションが Redis を共有し、マルチコア環境で動作する現代のインフラでは、従来の Redis では対応しきれない部分が出てきていました。
Redis 7 はこれらの背景を踏まえ、エンタープライズ利用に耐えうる機能強化を実現しています。
課題
Redis 6 以前のバージョンでは、以下のような課題が顕在化していました。
セキュリティ面の課題
Redis 6 で ACL(Access Control List)が導入されましたが、まだ制約がありました。
- ユーザーごとに実行可能なコマンドを制限できるものの、特定のキーパターンに対する細かい制御が不十分
- セレクター機能がないため、1 つのユーザーに複数の権限セットを柔軟に割り当てられない
- チーム間でのデータ分離やコンプライアンス要件への対応が困難
パフォーマンス面の課題
Redis は基本的にシングルスレッドで動作します。これによりデータ競合を避けられる反面、以下の問題がありました。
- ネットワーク I/O の処理がボトルネックになる:大量のクライアント接続や大きなデータ転送時に CPU が 1 コアしか使われない
- マルチコア CPU の性能を活かせず、スループットが頭打ちになる
- バックグラウンドタスク(RDB 保存など)以外で並列処理ができない
プロトコル面の課題
RESP2(Redis Serialization Protocol 2)では、クライアント側で以下の手間が発生していました。
- データ型情報がないため、クライアントライブラリ側で型を推測・変換する必要がある
- エラーメッセージや属性情報が限定的で、デバッグや詳細情報の取得が困難
- 新しいデータ型(Stream、Geo など)に対応しづらく、拡張性に欠ける
以下の図は、従来の Redis における課題の関係性を示しています。
mermaidflowchart LR
sec["セキュリティ<br/>課題"] --> impact1["データ分離<br/>困難"]
perf["パフォーマンス<br/>課題"] --> impact2["スループット<br/>頭打ち"]
proto["プロトコル<br/>課題"] --> impact3["開発効率<br/>低下"]
impact1 --> result["エンタープライズ<br/>利用の制約"]
impact2 --> result
impact3 --> result
これらの課題を解決するために、Redis 7 では ACL v2、I/O Threads、RESP3 という 3 つの新機能が導入されました。
解決策
Redis 7 では、前述の課題に対して以下の 3 つの新機能で解決策を提供しています。
ACL v2:セレクターによる柔軟なアクセス制御
ACL v2 では セレクター(Selector) という概念が導入されました。これにより、1 つのユーザーに対して複数の権限セットを条件に応じて適用できます。
主な改善点
- セレクター単位での権限設定:コマンドとキーパターンの組み合わせを複数定義可能
- 動的な権限切り替え:実行するコマンドに応じて、適切なセレクターが自動的に選択される
- より細かいキーパターン制御:正規表現やグロブパターンで柔軟に制御
以下は、ACL v2 の概念を図解したものです。
mermaidflowchart TB
user["ユーザー:<br/>developer"] --> sel1["セレクター1<br/>コマンド: GET/SET<br/>キー: user:*"]
user --> sel2["セレクター2<br/>コマンド: HGETALL<br/>キー: session:*"]
user --> sel3["セレクター3<br/>コマンド: LPUSH<br/>キー: queue:*"]
sel1 --> action1["読み書き可能<br/>user:123"]
sel2 --> action2["読み取り可能<br/>session:abc"]
sel3 --> action3["書き込み可能<br/>queue:tasks"]
この図が示すように、1 つのユーザーが複数の役割(セレクター)を持ち、操作対象に応じて適切な権限が適用されます。
I/O Threads:マルチスレッドによる I/O 処理の高速化
Redis 7 では、ネットワーク I/O 処理を複数のスレッドで並列実行できるようになりました。コマンドの実行自体はシングルスレッドのまま維持されるため、データ競合の心配はありません。
主な特徴
- 読み取り・書き込みの両方で I/O Threads を利用可能(Redis 6 では書き込みのみ)
- CPU のマルチコアを活用し、ネットワーク処理のスループットが向上
- 大量のクライアント接続や大きなデータ転送時に効果を発揮
I/O Threads の動作イメージは以下の通りです。
mermaidflowchart LR
client1["クライアント1"] -->|リクエスト| io1["I/O Thread 1"]
client2["クライアント2"] -->|リクエスト| io2["I/O Thread 2"]
client3["クライアント3"] -->|リクエスト| io3["I/O Thread 3"]
io1 --> main["メイン<br/>スレッド<br/>コマンド実行"]
io2 --> main
io3 --> main
main --> io1
main --> io2
main --> io3
io1 -->|レスポンス| client1
io2 -->|レスポンス| client2
io3 -->|レスポンス| client3
ネットワーク I/O を複数スレッドで処理しつつ、コマンド実行はメインスレッドで行うため、Redis の安全性を保ちながらパフォーマンスが向上します。
RESP3:型情報とメタデータの強化
RESP3(Redis Serialization Protocol 3)は、プロトコルレベルでの大幅な改善です。データ型情報やメタデータが含まれるようになり、クライアント側の実装がシンプルになります。
主な改善点
- データ型の明示:文字列、整数、配列、マップ、セットなどを明確に区別
- 属性(Attributes)のサポート:コマンドの実行時間や TTL などのメタ情報を取得可能
- プッシュ型メッセージ:Pub/Sub やキーの有効期限通知など、サーバー側からクライアントへ非同期で通知
- エラー情報の詳細化:エラーコードや詳細メッセージで問題の特定が容易
RESP2 と RESP3 の違いを以下の表で整理します。
| # | 項目 | RESP2 | RESP3 |
|---|---|---|---|
| 1 | データ型情報 | なし(クライアント側で推測) | 明示的に含まれる |
| 2 | マップ型 | 配列で代用 | ネイティブサポート |
| 3 | セット型 | 配列で代用 | ネイティブサポート |
| 4 | 属性情報 | 非サポート | サポート |
| 5 | プッシュ通知 | 限定的 | 充実 |
| 6 | エラー詳細 | 簡易 | 詳細化 |
RESP3 により、クライアントライブラリの実装が簡潔になり、開発者はより直感的に Redis を扱えるようになりました。
以下の図は、RESP3 のデータフローを示しています。
mermaidsequenceDiagram
participant C as クライアント
participant R as Redis サーバ
C->>R: HELLO 3
R->>C: RESP3 モード有効化
C->>R: HGETALL user:123
R->>C: Map 型<br/>name: "Alice"<br/>age: 30<br/>属性: TTL=3600
Note over C: 型情報とメタデータを<br/>直接取得
RESP3 を使うことで、データ型やメタ情報を明示的に受け取れるため、クライアント側の処理が大幅に簡素化されます。
具体例
それでは、Redis 7 の新機能を実際にどう使うのか、具体的なコード例とともに見ていきましょう。
ACL v2 の設定例
ACL v2 でセレクターを使った権限設定を行います。ここでは、開発者ユーザーが複数の役割を持つケースを想定します。
ユーザーの作成
まず、Redis CLI でユーザーを作成します。
bash# Redis CLI に接続
redis-cli
セレクターを使った ACL 設定
以下のコマンドで、セレクター付きの ACL ルールを定義します。
redis# ユーザー "developer" を作成し、パスワードを設定
ACL SETUSER developer on >mypassword
redis# セレクター1:user:* キーに対して GET/SET を許可
ACL SETUSER developer (~user:*) (+GET +SET)
redis# セレクター2:session:* キーに対して HGETALL を許可
ACL SETUSER developer (~session:*) (+HGETALL)
redis# セレクター3:queue:* キーに対して LPUSH を許可
ACL SETUSER developer (~queue:*) (+LPUSH)
このように、1 つのユーザーに対して複数のキーパターンとコマンドの組み合わせを設定できます。
動作確認
設定した ACL が正しく動作するか確認してみましょう。
bash# developer ユーザーで認証
AUTH developer mypassword
redis# user:* キーに SET を実行(成功)
SET user:123 "Alice"
# => OK
redis# session:* キーに HGETALL を実行(成功)
HGETALL session:abc
# => (empty array)
redis# queue:* キーに LPUSH を実行(成功)
LPUSH queue:tasks "task1"
# => (integer) 1
redis# 許可されていないキーへのアクセス(失敗)
SET admin:config "value"
# => NOPERM this user has no permissions to access one of the keys used as arguments
この例から、セレクターによって細かく制御できることがわかりますね。
I/O Threads の設定例
I/O Threads を有効化し、マルチコアを活用してパフォーマンスを向上させます。
redis.conf の設定
Redis の設定ファイル(redis.conf)を編集します。
conf# I/O スレッド数を設定(CPU コア数に応じて調整)
io-threads 4
conf# 読み取り処理でも I/O Threads を有効化
io-threads-do-reads yes
この設定により、4 つの I/O スレッドが起動し、ネットワーク I/O が並列処理されます。
設定の適用
設定ファイルを保存し、Redis を再起動します。
bash# Redis サーバーを再起動
redis-server /path/to/redis.conf
パフォーマンス確認
ベンチマークツールで効果を測定してみましょう。
bash# redis-benchmark でスループットを測定
redis-benchmark -t set,get -n 1000000 -q
I/O Threads を有効化することで、特に大量のクライアント接続がある場合に、スループットが向上します。実際の環境では、CPU 使用率の分散も確認できるでしょう。
以下は、I/O Threads 有効化前後のイメージです。
mermaidflowchart LR
before["I/O Threads 無効"] --> cpu1["CPU コア1のみ<br/>使用率 100%"]
after["I/O Threads 有効"] --> cpu2["CPU コア1<br/>使用率 60%"]
after --> cpu3["CPU コア2<br/>使用率 40%"]
after --> cpu4["CPU コア3<br/>使用率 40%"]
after --> cpu5["CPU コア4<br/>使用率 40%"]
cpu1 --> result1["スループット<br/>50,000 ops/sec"]
cpu2 --> result2["スループット<br/>120,000 ops/sec"]
cpu3 --> result2
cpu4 --> result2
cpu5 --> result2
この図のように、マルチコアを活用することで、全体のスループットが大幅に向上します。
RESP3 の利用例
RESP3 を使って、型情報やメタデータを取得する例を見てみましょう。
RESP3 モードの有効化
クライアント側で RESP3 を有効にします。
bash# Redis CLI で RESP3 を有効化
redis-cli
HELLO 3
redis# 応答例
1) "server"
2) "redis"
3) "version"
4) "7.0.0"
5) "proto"
6) (integer) 3
7) "id"
8) (integer) 2
9) "mode"
10) "standalone"
これで RESP3 プロトコルが有効になりました。
Map 型の取得
RESP3 では、ハッシュデータが Map 型として返されます。
redis# ハッシュデータを設定
HSET user:456 name "Bob" age 25 city "Tokyo"
redis# HGETALL でデータを取得
HGETALL user:456
redis# RESP3 の応答(Map 型として返される)
%3
"name"
"Bob"
"age"
"25"
"city"
"Tokyo"
RESP2 では配列として返されますが、RESP3 では Map 型として明示的に返されるため、クライアントライブラリでの処理が簡単になります。
属性情報の取得
RESP3 では、コマンドの実行結果に属性(Attributes)を付与できます。
redis# DEBUG オプションで属性情報を確認(開発環境での例)
GET user:123
RESP3 対応のクライアントライブラリを使うと、TTL やメモリ使用量などのメタ情報も取得可能です。
Node.js での RESP3 利用例
Node.js で RESP3 を使う場合の実装例です。
javascript// redis パッケージのインポート
const redis = require('redis');
javascript// Redis クライアントの作成(RESP3 を指定)
const client = redis.createClient({
socket: {
host: 'localhost',
port: 6379,
},
protocol: 'RESP3', // RESP3 を有効化
});
javascript// 接続処理
async function main() {
await client.connect();
// HGETALL でデータを取得
const data = await client.hGetAll('user:456');
// Map 型として直接扱える
console.log(data);
// => { name: 'Bob', age: '25', city: 'Tokyo' }
await client.disconnect();
}
javascript// エラーハンドリング付きで実行
main().catch(console.error);
RESP3 を使うことで、型変換の手間が減り、コードがシンプルになりますね。
まとめ
Redis 7 で導入された ACL v2、I/O Threads、RESP3 は、それぞれ異なる課題に対する強力な解決策です。
ACL v2 では、セレクターによって 1 つのユーザーに複数の権限セットを柔軟に割り当てられるようになり、マルチテナント環境やチーム間のデータ分離が容易になりました。セキュリティとコンプライアンス要件への対応が大幅に向上しています。
I/O Threads により、ネットワーク I/O がマルチスレッド化され、マルチコア CPU の性能を最大限に活用できます。大量のクライアント接続や大規模なデータ転送が発生する環境では、スループットが劇的に向上するでしょう。
RESP3 は、プロトコルレベルでの改善により、データ型情報やメタデータを明示的に取得できるようになりました。クライアントライブラリの実装が簡素化され、開発効率が向上します。
これら 3 つの新機能は、Redis をよりエンタープライズレベルで活用するための基盤となります。既存の Redis を使っている方も、これから導入を検討している方も、ぜひ Redis 7 の新機能を試してみてください。パフォーマンス、セキュリティ、開発効率のすべてが向上し、システム全体の品質が高まることを実感できるはずです。
関連リンク
articleRedis 7 の新機能まとめ:ACL v2/I/O Threads/RESP3 を一気に把握
articleRedis 監視と可観測性:Prometheus Exporter と Grafana の実践ダッシュボード
articleRedis 使い方:Next.js で Cache-Tag と再検証を実装(Edge/Node 両対応)
articleRedis キャッシュ設計大全:Cache-Aside/Write-Through/Write-Behind の実装指針
articleRedis コマンド 100 本ノック:Key/Hash/List/Set/ZSet/Stream 早見表
articleRedis セットアップ完全版(macOS/Homebrew):設定テンプレ付き最短構築
articleLodash の組織運用ルール:no-restricted-imports と コーディング規約の設計
articleRedis 7 の新機能まとめ:ACL v2/I/O Threads/RESP3 を一気に把握
articleLlamaIndex の Chunk 設計最適化:長文性能と幻覚率を両立する分割パターン
articleReact フック完全チートシート:useState から useTransition まで用途別早見表
articleLangChain × Docker 最小構成:軽量ベースイメージとマルチステージビルド
articlePython UnicodeDecodeError 撲滅作戦:エンコーディング自動判定と安全読込テク
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来