Redisデータ構造ガイド:基本型と特殊型の使い分けと注意点
Redisを始めたばかりの方にも、機能のおさらいが必要な方にも役立つように、このガイドではRedisが提供するすべてのデータ構造をわかりやすく解説します。
適切なデータ構造を選ぶ
Redisのデータ構造はいずれもシンプルで、解決したい問題に完璧に一致するものは存在しないかもしれません。しかし、データに合った適切な構造を最初に選べば、Redisのコマンドが効率的な解決策へと導いてくれます。多くのRedisコマンドにはプレフィックス(接頭辞)が付いており、それが対象となるデータ構造の種類を示しています。
汎用データ構造
| プレフィックス | 主な用途 | 注意点・よくある誤用 | |
|---|---|---|---|
| Hash | H | オブジェクトの保存。辞書オブジェクトを使うような場面全般 | Redis本体と同様、ハッシュで最大の問題の一つはキーの管理です。不要なキーや値でハッシュが埋まらないよう、事前に管理の仕組みを整えておきましょう。 |
| List | L | キュー、スタック、循環リスト | 大きなリストへのランダムアクセスは避け、キューの滞留(バックログ)にも注意しましょう。 |
| Set | S | タグ付けシステム、時系列データのバケット | 集合演算(積や和)は慎重に使い、セットは小さく保つのが鉄則です。ユニーク数のカウントにはセットは不向きなので、代わりにHyperLogLogを使いましょう! |
| Sorted Set | Z | スコアボード、辞書順検索、ランダムアクセスリスト | ZSetは最も汎用性の高い構造の一つであると同時に、最もコストのかかる構造でもあります。計算量(ビッグオー)に常に注意を払いましょう。オートコンプリートに使う場合は、辞書順検索を扱うZRANGEBYLEXの検討をおすすめします(ただしUTF-8の扱いには要注意!)。 |
| Stream | X | 時系列データ、キュー、メッセージ配信 | ストリームに上限(キャップ)を設定しない失敗は非常によく見られます。また、分散メッセージングシステム(特にApache Kafka)の機能と混同されることもあるので注意しましょう。 |
| String | (なし) | シンプルなキャッシュ、カウンター、ビット操作 | 非常に大きな値には注意が必要です。巨大な値のGETやSETは、特定のネットワーク環境やRedisクライアントにおいて発見しにくい障害を引き起こすことがあります。また、SETNXでロック機構を自作すると思わぬ落とし穴にはまりやすい点にも留意してください。 |
特殊用途のデータ構造
Redisは、特定の型の特殊なケースを操作するためのコマンド群も多数提供しています。これらの内部実装は、前述の汎用データ型のいずれかになっています。
| プレフィックス | 基盤となる型 | 主な用途 | 注意点・よくある誤用 | |
|---|---|---|---|---|
| Bitmap | BIT | String | 分析向けの省スペースなフラグ管理 | 機能に関する誤解や、ビットマップベースのシステムにおける複雑なキー管理の手間が課題になりがちです。 |
| Counter | INCR, DECR | String | 省スペースな分析・集計 | 64ビット符号付き整数の範囲を超えるとエラーが返されます。 |
| Geohash | GEO | Sorted Set | 店舗検索、近隣ユーザーの検索 | 長距離の計算や、特殊な投影法・高度な地理的関数が必要なケースには不向きです。 |
| HyperLogLog | PF | String | 分析のためのユニーク数カウント | 複数のHLLをマージするのはコストが高くなります。PFMERGEで指定するパラメータ数には上限を設けておきましょう。 |
| Pub/Sub | PUB, SUB, PSUB | (なし) | 一時的なメッセージパッシング | シンプルかつ高速ですが、永続性はありません。ほとんどのユースケースではStream型の方が適しています。 |
計算量(Big O)を意識する
データ構造のアクセスパターンを誤るのは、辞書で単語を調べるときに最初のページから順にめくるようなものです。無駄な検索は避けましょう。すべてのRedisコマンドの時間計算量はredis.ioで公式に文書化されています。
ビッグオー記法は、処理の「限界挙動」を表現する方法です。簡単に言えば、システム内のデータ量が増えたときにその操作がどう変化するかを示す指標です。O(1)の操作は、データ量にかかわらず一定の時間で完了します。O(n)の操作はデータ量に比例して遅くなり、O(n²)の操作はデータ量の増加に伴って急激に(二乗オーダーで)遅くなります。
より深く学びたい方は、サンプルコードとグラフ付きのビッグオー入門資料を参照することをおすすめします。
優れたシステム設計には基本的なアルゴリズム解析以上の知識が必要ですが、基礎を定期的に復習し、アプリケーション全体でのデータアクセスの総合的な複雑さを意識することは大きな価値があります。
操作は小さく保つ
Redisはシングルスレッドで動作します。これは動作を予測しやすい反面、マルチスレッドのデータアクセスに慣れた人にとっては意外に感じられる点でもあります。Redisでは、長時間実行される操作は他のデータベースよりも危険です。一度に一つの処理しか実行できないため、長時間の操作がシステム全体の滞留を引き起こしかねません。
データアクセス操作を細かく分割することが、Redisで高いパフォーマンスを引き出す鍵となります。10万要素のコレクションに対して1回のO(N)操作を実行するよりも、10万回のO(1)操作を実行する方が、ネットワークやプロトコル解析のオーバーヘッドを考慮しても、結果的に好ましいことが多いのです。
では、システムのボトルネックはどうやって見つければよいのでしょうか?SLOWLOGを定期的に確認しましょう(RedisGreenをご利用の場合は、ダッシュボードの「Slow Queries」タブを見るだけでOKです)。単一の操作が長引けば長引くほど、システムが実行しようとしている他のすべての処理が遅くなります。操作は短く保つことを心がけましょう!
-
Redisで実現するベクトル類似性検索(VSS)のすべて:基礎知識から活用事例、始め方まで
Redisの新時代:ベクトル類似性検索(VSS)とは RedisDays NY 2022において、Redisは新しい「ベクトル類似性検索(Vector Similarity Search:VSS)」機能のパブリックプレビューを発表しました。VSSはRediSearch 2.4の一部として提供されており、Docker、Redis Stack、そしてRedis Enterprise Cloudの無料プランおよび固定サブスクリプションで利用できます。 本記事では、ベクトル類似性の基本概念からその応用例までをわかりやすく解説し、Redis VSSを始めるためのリソースをご紹介します。 ベクトル類似性
-
Redis(REmote DIctionary Server)とは?基本概念と主な特徴を徹底解説【初心者向けチュートリアル】
Redisは、BSDライセンスのオープンソースNoSQLデータベースです。データをメインメモリ(RAM)上に格納するインメモリデータベースであり、キーバリューストアという仕組みに基づいて設計されています。また、データ構造ストア(Data Structure Store)とも呼ばれています。 それでは、それぞれの用語をひとつずつ詳しく見ていきましょう。 1. キーバリューストア(Key-Value Store) キーバリューストアとは、データを「キー」と「値」のペアとして保存・取得するデータストレージの方式です。各キーは、データベース内に保存された値を一意に識別する役割を持ちます。Redisは、