|
Redisでアプリケーションを開発するのは楽しいプロセスですが、どんな技術でもそうであるように、Redisベースのアプリケーションを設計する際にはいくつか注意すべき点があります。 リレーショナルデータベース開発の一連の流れにはすでに馴染みがあるかもしれませんし、Redisベースのアプリケーション開発には多くの類似点がありますが、次の2点を覚えておく必要があります。Redisはインメモリ型データベースであり、シングルスレッドです。 したがって、Redisを利用する際には以下の点に注意する必要があります。 1. Redisに保存されているすべての鍵を制御 データベースの主な機能はデータを保存することですが、アプリケーションの要件やデータ利用方法の変更により、開発者がデータベースに保存されたデータを無視するのが一般的であり、Redisでも同様です。 期限切れになるキーを見落としたり、アプリケーションのモジュールが非推奨化されているためにデータを忘れたりすることもあります。 いずれの場合も、Redisは使われていないデータを保存し、理由もなくスペースを占有します。 Redisの弱い構造化データパターンでは、キーに非常に成熟した命名法を使わない限り、中央に何が保存されているかを特定するのが難しいです。 適切な命名方法を使うことでデータベース管理が簡素化され、アプリケーションやサービスを通じてキーの名前空間(通常はコロンでキー名を分ける)を作成すると、データの移行、変換、削除時に簡単に識別できます。 Redisのもう一つの一般的な用途は、ホットデータ項目の第二のデータストアとして使われることで、ほとんどのデータはPostgreSQLやMongoDBなど他のデータベースに保存されています。 こうしたユースケースでは、データがプライマリストレージから削除される際に、開発者は対応するデータをRedisで削除し忘れることがよくあります。 この場合、通常カスケード削除が必要であり、Redisの設定で特定のデータ項目のすべての識別子を保存することで実現できます。これにより、プライマリデータベースでデータが削除された後、クリーナーが呼び出されて関連するすべてのコピーや情報が削除されるようになります。 2. すべてのキーネームの長さを制御する 前述の通り、適切な命名規則を使い、データの行き先を示す接頭辞を追加しましたが、これはそれに反しているように思えます。 ただし、Redisはメモリ内データベースであり、キーが短いほど必要な容量は少なくなります。 当然ながら、データベースに何百万、数十億もの鍵が存在する場合、鍵名の長さは大きな影響を与えます。 例えば、32ビットのRedisサーバー上で、32文字の鍵を100万個保存すると、6文字のキー名を使うと約96MBの容量を消費しますが、12文字のキー名を使うと約111MBに増加します。 鍵が増えると、追加の15%のオーバーヘッドは大きな影響を及ぼします。 3. 適切なデータ構造を使用すること メモリ使用量やパフォーマンスのどちらであっても、データ構造が大きな影響を与えることがあります。参考になるベストプラクティスをいくつかご紹介します。 データを数千(あるいは数百万)もの別々の文字列として保存する代わりに、関連するデータをグループ化するためにハッシュ化されたデータ構造を使うことを検討してください。 ハッシュテーブルは非常に効率的で、メモリ使用量を削減できます。 同時に、ハッシュは詳細の抽象化やコードの可読性にもより有利です。 適切な場合はsetではなくlistを使いましょう。 セット機能を使う必要がなければ、Listは設定より速い速度を提供でき、メモリ消費も少ないです。 ソートされた集合は、メモリ消費量と基本操作の複雑さの両面で最もコストがかかるデータ構造です。 もしレコードをクエリするだけで、そうした属性のソートを気にしないなら、ハッシュテーブルの使用を強くお勧めします。 Redisで見落とされがちな機能の一つにビットマップやビットセット(V2.2以降)があります。 ビットセットは、Redisの値に対して複数のビットレベルの操作を行うことを可能にします。例えば、軽度解析などです。 4. SCAN使用時にはキーを使用しないでください Redis v2.8時点で、すでにSCANコマンドが利用可能で、カーソルを使ってキー空間からキーを取得できます。 KEYSコマンドと比べて、すべての一致結果を一度に返すことはできませんが、システムのブロックリスクを回避できるため、一部の操作をマスターノード上で実行できます。 SCANコマンドはカーソルベースのイテレーターであることに注意が必要です。 SCANコマンドが呼び出されるたびに新しいカーソルがユーザーに返され、ユーザーは次の反復でこの新しいカーソルをSCANコマンドのカーソルパラメータとして使用し、前回の反復プロセスを継続する必要があります。 同時に、SCANではキーネームモードやカウントオプションを使ってコマンドを調整することも可能です。 SCAN関連コマンドには、SSCANコマンド、HSCANコマンド、ZSCANコマンドも含まれ、それぞれコレクション、ハッシュキー、シークエルに使用されます。 5. サーバーサイドのLuaスクリプトを使用する Redisを利用する過程で、Luaスクリプトのサポートは間違いなく開発者に非常にフレンドリーな開発環境を提供し、ユーザーの創造性を大幅に解放しています。 正しく使用すれば、Luaスクリプトはパフォーマンスとリソース消費に大きな改善をもたらします。 CPUにデータを渡す代わりに、スクリプトはデータに最も近いロジックを実行することを可能にするため、ネットワークの遅延や冗長なデータ転送を削減します。 Redisでは、Luaの非常に典型的なユースケースは、データフィルタリングやデータをアプリケーションに集約することです。 処理ワークフローをスクリプトにまとめることで、少ないリソースでより短時間で小さな回答を得るために呼び出せます。 プロのコツ:Luaは素晴らしいですが、報告の難しさやバグの処理などいくつかの問題もあります。 賢いアプローチとしては、RedisのPub/Sub機能を使い、スクリプトが専用チャネルでログメッセージをプッシュできるようにすることです。 次にサブスクライバープロセスを作成し、それに応じて処理します。
|