【導入】Redis (Remote Dictionary Server)
- 高速なインメモリデータストア
- 用途・ユースケース
- キャッシュ
- メッセージブローカー
- セッション管理
- リアルタイム分析
- ランキングシステム
- 特徴
パフォーマンスについて
- すべてのデータがメモリ内に保存されるため、読み書き操作が非常に高速で、ミリ秒単位のレスポンスが可能
- メモリアクセスがディスクアクセスよりも早い
- リアルタイムアプリケーションや高頻度の読み書き操作が必要なシステムで有用
永続化
- インメモリデータベースでありながら、データの永続化機能も有する
- スナップショット方式(RDB)や、アペンドオンリーログ(AOF)といったメカニズムを使用して、メモリ内のデータをディスクに保存
- Redisサーバーが再起動してもデータの整合性が保たれる
クラスタリングとレプリケーション
- スケーラビリティ
- クラスタリング機能でデータを複数のノードに分散して保存することで、負荷分散が可能→大規模なデータセットを扱うことができる
- レプリケーション機能により、データの冗長性を確保して、フェイルオーバーを容易に実現できる
- フェイルオーバー:システムやコンポーネントが故障した時に自動的に予備のシステムに切り替わるプロセス
多様なデータ構造のサポート
- 多様なデータ構造をネイティブにサポートしていて、複雑なデータ処理を簡単に行うことができる
- 例
- リストを使用して、メッセージキュー実装する
- ソートセットを利用して、ランキングシステムを構築する
- ハッシュを使用してユーザーセッション情報を管理する
対応されているデータ構造(一部)
Data Type データ構造 説明 Strings 文字列 バイナリセーフな文字列データ Lists リスト 双方向リンクリスト。メッセージキューやタスクキューとして利用される Sets セット 重複を許さない無序集合。タグやカテゴリーの管理に有効 Sorted Sets ソートセット スコア付きの集合。ランキングシステムやリーダーボードに最適 Hashes ハッシュ フィールドと値のペア。ユーザーセッションの情報や設定データの管理に利用。 Bitmaps ビットマップ ビット単位の操作。フラグやビットフィールドの管理に適している。 HyperLogLogs ハイパーログログ 大規模データセットのユニーク要素数を近似的に数える。カウントデータの効率的な管理に役立ちます。 Geospatial Indexes 地理空間インデックス 地理空間データの管理。位置情報に基づくクエリや検索が可能です。 Streams ストリーム 時間順に追加されるデータのログ。リアルタイムデータ処理やイベントログの管理に使用されます。 開発者のためのRedisチュートリアル(1): https://meetup-jp.toast.com/3125
- ざっくり分かるRedis入門 ~データ構造と主な機能について~: https://qiita.com/t-kuni/items/c00d0994c2eb20681cb1
パフォーマンス
Redisのレスポンスが速い理由について、簡単にまとめます。
インメモリデータストア
データをメモリ内に保持するインメモリデータストアであるため、メモリはディスクと比較してアクセス速度が非常に高速で、ナノ秒単位での読み書きが可能
ディスクベースのデータベースシステムでは、ディスクI/Oがボトルネックになることが多く、遅延が発生することがある
RAMを使用するため、ディスクアクセスよりも高速
単一スレッドアーキテクチャ
シンプルな並行性モデル
単一スレッドアーキテクチャを採用しているため、複雑なマルチスレッド処理やロック機構が不要となり、データの一貫性を維持しながら高速な処理を実現
単一スレッドであるため、コンテキストスイッチやスレッド間の競合、デッドロックなどの複雑な問題が発生せず、リクエストの処理が効率的
イベントループ
Redisはlibeventやlibevなどのイベントライブラリを使用して、非同期I/O操作を効率的に処理する
イベントループを使用することで非同期I/O操作を行いながらCPUの使用効率を最大化し、リクエストに対するレスポンス時間を短縮
イベント駆動型のアーキテクチャは、高いスループットと低いレイテンシを実現するために重要
永続化について
- スナップショット(RDB: Redis Database File)
- 特定の時点でのデータ全体のスナップショットをディスクに保存
- メモリ内のデータをバイナリ形式でディスクに書き出し、一定の間隔で自動的に保存されるように設定できる
- AOF (Append-Only File)
- すべての書き込み操作をログ形式で順次ディスクに追加する方法
Redis Clusterの基本概念
クラスタ通信
ノード間の通信は以下のプロトコルを使用して行われる
- ゴシッププロトコル
- クラスタバス: https://mogile.web.fc2.com/redis/docs/reference/cluster-spec/index.html
- フェイルオーバー
- スレーブ
- Slave = Replica
- マスターノードのデータを複製する役割を持つノード
レプリカノードを追加した時