T-CREATOR

Redis 7 の新機能まとめ:ACL v2/I/O Threads/RESP3 を一気に把握

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 の違いを以下の表で整理します。

#項目RESP2RESP3
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 v2I/O ThreadsRESP3 は、それぞれ異なる課題に対する強力な解決策です。

ACL v2 では、セレクターによって 1 つのユーザーに複数の権限セットを柔軟に割り当てられるようになり、マルチテナント環境やチーム間のデータ分離が容易になりました。セキュリティとコンプライアンス要件への対応が大幅に向上しています。

I/O Threads により、ネットワーク I/O がマルチスレッド化され、マルチコア CPU の性能を最大限に活用できます。大量のクライアント接続や大規模なデータ転送が発生する環境では、スループットが劇的に向上するでしょう。

RESP3 は、プロトコルレベルでの改善により、データ型情報やメタデータを明示的に取得できるようになりました。クライアントライブラリの実装が簡素化され、開発効率が向上します。

これら 3 つの新機能は、Redis をよりエンタープライズレベルで活用するための基盤となります。既存の Redis を使っている方も、これから導入を検討している方も、ぜひ Redis 7 の新機能を試してみてください。パフォーマンス、セキュリティ、開発効率のすべてが向上し、システム全体の品質が高まることを実感できるはずです。

関連リンク