RedisにおけるBig Key問題の最適化
Emily Parker
Product Engineer · Leapcell

Redisのビッグキー問題とは?
Redisのビッグキー問題とは、キーが大量のメモリを占有する値に対応する場合を指し、Redisのパフォーマンス低下、メモリ不足、データ不均衡、およびマスター/スレーブ同期の遅延を引き起こします。
キーがビッグキーと見なされるには、どのくらいの大きさが必要ですか?
ビッグキーを定義するための固定された基準はありません。通常、文字列型の値が1MBを超えるキー、または10,000を超える要素を含むコレクション型のキーは、ビッグキーと見なされます。
ビッグキーの定義と評価基準は固定されておらず、Redisの使用シナリオとビジネス要件に基づいて評価する必要があります。たとえば、高同時実行、低遅延のシナリオでは、10KBでもビッグキーを構成する可能性がありますが、低同時実行、大容量の環境では、ビッグキーのしきい値は100KBになる可能性があります。したがって、Redisを設計および使用する際には、ビジネスニーズとパフォーマンス指標に基づいて、妥当なビッグキーのしきい値を決定することが不可欠です。
ビッグキーの影響
- 過剰なメモリ使用量:ビッグキーは大量のメモリを消費するため、メモリ不足を引き起こし、削除ポリシーをトリガーする可能性があります。極端な場合、メモリを使い果たし、Redisインスタンスがクラッシュし、システムの安定性に影響を与える可能性があります。
- パフォーマンスの低下:ビッグキーは大量のメモリを占有するため、メモリの断片化が増加し、Redisのパフォーマンスに影響を与えます。ビッグキーに対する読み取り、書き込み、削除などの操作は、より多くのCPU時間とメモリリソースを消費し、システムパフォーマンスをさらに低下させます。
- 他の操作のブロック:ビッグキーに対する特定の操作は、Redisインスタンスをブロックする可能性があります。たとえば、
DEL
コマンドを実行してビッグキーを削除すると、Redisインスタンスが他のクライアントリクエストに応答しなくなる可能性があり、応答時間とスループットに影響します。 - ネットワークの輻輳:ビッグキーを取得すると、大量のネットワークトラフィックが生成され、マシンまたはローカルネットワークの帯域幅が飽和状態になり、他のサービスに影響を与える可能性があります。たとえば、ビッグキーのサイズが1MBで、1秒あたり1,000回アクセスされる場合、1,000MB(1GB)のトラフィックが生成されます。
- マスター/スレーブ同期の遅延:マスター/スレーブ同期で構成されたRedisインスタンスでは、ビッグキーが同期の遅延を引き起こす可能性があります。ビッグキーは大量のメモリを消費するため、同期中に転送するとネットワーク遅延が増加し、データの整合性に影響を与えます。
- データの偏り:Redisクラスタモードでは、1つのデータシャードが他のシャードよりも大幅に多くのメモリを消費すると、シャード間でバランスの取れたメモリ使用ができなくなります。さらに、Redisで定義された
maxmemory
しきい値に達すると、クリティカルキーが削除され、メモリオーバーフローが発生する可能性があります。
ビッグキーの原因
- 不適切なビジネス設計:これが最も一般的な原因です。単一のキーに大量のデータを格納することは避ける必要があります。代わりに、データを複数のキーに分散する必要があります。たとえば、全国のデータを、行政区画に基づいて34個のキーに分割するか、都市に基づいて300個のキーに分割して、ビッグキーの可能性を減らすことができます。
- 予期しない値の増加:データの削除、有効期限、またはサイズ制限なしに値に追加され続けると、最終的にビッグキーが発生します。例としては、ソーシャルメディアプラットフォーム上の有名人のフォロワーリストや、トレンドコメントのリストなどがあります。
- 不適切な有効期限の設定:キーに有効期限がない場合、または有効期限が非常に長い場合、値のデータ量が時間の経過とともに急速に蓄積され、ビッグキーが発生する可能性があります。
- プログラムのバグ:予期しない状況により、特定のキーが意図したよりも長く保持されたり、値のサイズが異常に増加したりして、ビッグキーが発生する可能性があります。
ビッグキーの識別方法
SCANコマンド
RedisのSCAN
コマンドを使用すると、データベース内のすべてのキーを徐々に走査できます。他のコマンド(STRLEN
、LLEN
、SCARD
、HLEN
など)と組み合わせて、ビッグキーを識別できます。SCAN
の利点は、Redisインスタンスをブロックせずに走査できることです。
bigkeysパラメータ
redis-cli
クライアントを使用して、次のコマンドを実行すると、各データ型の中で最大のキーをスキャンできます。
redis-cli -h 127.0.0.1 -p 6379 --bigkeys
Redis RDBツール
オープンソースのRedis RDBツールは、RDBファイルを分析してビッグキーをスキャンできます。たとえば、次のコマンドは、1KBを超えるメモリを占有する上位3つのキーを出力します。
rdb --command memory --bytes 1024 --largest 3 dump.rdb
ビッグキー問題の解決方法
- 複数の小さいキーに分割する:最も簡単な方法は、個々のキーのサイズを小さくすることです。複数のキーは、バッチ操作で
MGET
を使用して読み取ることができます。 - データ圧縮:
String
型を使用する場合、圧縮アルゴリズムを適用すると、値のサイズを小さくできます。または、Hash
型を使用すると、Redisは圧縮されたリストデータ構造を使用して小さいハッシュ値を効率的に格納するため、役立ちます。 - 妥当な有効期限を設定する:各キーに有効期限を割り当てて、データの有効期限が切れると自動的にクリアされるようにし、長期間にわたってビッグキーに蓄積されるのを防ぎます。
- メモリ削除ポリシーを有効にする:**Least Recently Used(LRU)**などのRedisメモリ削除戦略をアクティブにして、メモリが不足した場合に、最も使用されていないデータが自動的に削除されるようにし、ビッグキーが無期限にメモリを占有するのを防ぎます。
- データシャーディング:Redis Clusterを実装して、データを複数のRedisインスタンスに分散し、単一のインスタンスへの負担を軽減し、ビッグキーの問題を軽減します。
- ビッグキーの削除:
UNLINK
コマンドを使用して、ビッグキーを非同期的に削除します。DEL
とは異なり、UNLINK
はバックグラウンドでキーを削除するため、Redisインスタンスがブロックされるのを防ぎます。
結論
ビッグキーの問題は、Redisでよく見られる問題であり、パフォーマンスの低下、高いメモリ消費量、操作のブロック、およびマスター/スレーブの同期の遅延を引き起こす可能性があります。この記事では、ビッグキーの原因、影響、検出方法、および解決策について徹底的に説明しました。データ構造の設計を最適化し、適切な有効期限ポリシーを設定し、システムアーキテクチャと構成を改善し、ビッグキーを段階的に削除することで、ビッグキーの問題を効果的に軽減および防止し、Redisシステムの安定性とパフォーマンスを向上させることができます。
Leapcellは、組み込みのサーバーレスRedisを備えた、バックエンドプロジェクトをホストするための最高の選択肢です。
Leapcellは、Webホスティング、非同期タスク、およびRedisのための次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発します。
無制限のプロジェクトを無料でデプロイ
- 使用量に対してのみ課金され、リクエストや料金は発生しません。
比類のない費用対効果
- アイドル料金なしの従量課金制。
- 例:25ドルで、平均応答時間60ミリ秒で694万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察を得るためのリアルタイムメトリックとロギング。
容易なスケーラビリティと高性能
- 高い同時実行性を容易に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロで、構築に集中できます。
ドキュメントで詳細をご覧ください。
Xでフォローしてください:@LeapcellHQ