Redisが正しく使う10のテクニック

4185 ワード

Redisは現在のテクノロジーコミュニティで非常に人気があります.Antirezの小さな個人プロジェクトからメモリデータストレージ業界の標準になるまで、Redisは長い道のりを歩んできた.1、KEYSの使用を停止する*
Okay、この命令に挑戦してこの文章を始めるのは、良い方法ではないかもしれませんが、それは確かに最も重要な点かもしれません.多くの場合、redisインスタンスの統計データに注目すると、「KEYS*」コマンドをすばやく入力し、keyの情報が明らかになります.落ち着いて言えば、プログラム化の観点から、次のような偽コードを書く傾向があります.

for key in 'keys *': 
 doAllTheThings() 

しかし、1300万個のkeyがあると、実行速度が遅くなります.KEYSコマンドの時間的複雑度はO(n)であり、nは返されるkeysの個数であるため、このコマンドの複雑度はデータベースのサイズに依存する.この操作が実行されている間、他のコマンドはインスタンスでは実行できません.
代替コマンドとして、SCANを見てみましょう.これにより、より友好的な方法で実行できます.SCANはインクリメンタル反復でデータベースをスキャンします.この操作はカーソルの反復器に基づいて行われます.したがって、適切であれば、いつでも停止したり続行したりすることができます.
2、Redisを遅らせた元凶を見つけ出す
Redisには非常に詳細なログがないため,Redisインスタンス内で何をしたかを知ることは非常に困難である.幸いなことに、Redisは次のようなコマンド統計ツールを提供しています.

127.0.0.1:6379> INFO commandstats 
# Commandstats 
cmdstat_get:calls=78,usec=608,usec_per_call=7.79 
cmdstat_setex:calls=5,usec=71,usec_per_call=14.20 
cmdstat_keys:calls=2,usec=42,usec_per_call=21.00 
cmdstat_info:calls=10,usec=1931,usec_per_call=193.10 

このツールでは、コマンドが何回実行されたか、コマンドを実行するのに費やしたミリ秒数(コマンドごとの合計時間と平均時間)など、すべてのコマンド統計のスナップショットを表示できます.
CONFIG RESETSTATコマンドを簡単に実行するだけでリセットでき、新しい統計結果が得られます.
3、Redis-Bunchmark結果を参考にして、一概には言わない
Redisの父Salvatoreは、「GET/SETコマンドを実行してRedisをテストするのは、雨の日にフェラーリのブラシで鏡をきれいにする効果を検出するようなものだ」と話しています.多くの場合、人々は私のところに走って、彼らはなぜ自分のRedis-Bunchmark統計の結果が最良の結果より低いのかを知りたいと思っています.しかし、私たちは様々な実際の状況を考慮しなければなりません.例えば、
  • は、どのクライアントの実行環境によって制限される可能性がありますか?
  • は同じバージョン番号ですか?
  • テスト環境でのパフォーマンスは、アプリケーションが実行する環境と一致していますか?

  • Redis-Benchmarkのテスト結果は、Redis-Serverが非正常な状態で動作しないことを保証する基準点を提供していますが、実際の「圧力テスト」として使用しないでください.圧力試験は応用の動作方式を反応させる必要があり,できるだけ生産に似た環境が必要である.
    4、Hashesはあなたの最良の選択です
    優雅な方法でhashesを導入しましょう.hashesはあなたにかつてない体験をもたらします.以前、次のようなkey構造を見たことがあります.
    
    foo:first_name 
    foo:last_name 
    foo:address 
    

    上記の例では、fooはユーザーのユーザー名であり、各項目は個別のkeyである可能性があります.これにより、ミスを犯す空間と、不要なkeyが増加します.hashの代わりにhashを使うと、驚くべきことにkeyが1つしか必要ないことに気づきます.
    
    127.0.0.1:6379> HSET foo first_name "Joe" 
    (integer) 1 
    127.0.0.1:6379> HSET foo last_name "Engel" 
    (integer) 1 
    127.0.0.1:6379> HSET foo address "1 Fanatical Pl" 
    (integer) 1 
    127.0.0.1:6379> HGETALL foo 
    1) "first_name" 
    2) "Joe" 
    3) "last_name" 
    4) "Engel" 
    5) "address" 
    6) "1 Fanatical Pl" 
    127.0.0.1:6379> HGET foo first_name 
    "Joe" 
    

    5、key値の生存時間を設定する
    いつでも可能な限りkeyタイムアウトの利点を利用します.良い例は、一時認証keyのようなものを保存することです.ライセンスキーを検索すると、OAUTHを例にとると、通常はタイムアウト時間が得られます.これでkeyを設定したとき、同じタイムアウト時間にすると、Redisが自動的にクリアします!KEYS*を使ってすべてのkeyを遍歴する必要はありません.どうすれば便利ですか?
    6、適切な回収策略を選択する
    keyのクリアについて話した以上、回収戦略について話しましょう.Redisのインスタンス空間が満たされると、keyの一部を回収しようとします.あなたの使い方によって、私はVolatile-lru戦略を強くお勧めします.keyにタイムアウトが設定されていることを前提としています.しかし、cacheに似たようなものを実行し、keyにタイムアウトメカニズムを設定していない場合は、allkeys-lru回収メカニズムを使用することを考慮することができます.私の提案はまずここで実行可能な案を確認することです.
    7、データが重要な場合はTry/Exceptを使用してください
    重要なデータをRedisのインスタンスに入れる必要がある場合は、try/exceptブロックに入れることを強くお勧めします.ほとんどのRedisクライアントは「送信忘れ」ポリシーを採用しているため、keyが本当にRedisデータベースに格納されているかどうかを考慮する必要があります.try/expectをRedisコマンドに配置する複雑さについては、本明細書で説明するのではなく、重要なデータを配置する場所を確保できることを知っておく必要があります.
    8、一例を使い果たさない
    いずれにしても,可能であれば複数のredisインスタンスのワークロードを分散する.バージョン3.0.0からRedisはクラスタをサポートしています.Redisクラスタを使用すると、key範囲に基づいて、マスター/スレーブモードを含むkeyの一部を分離できます.完全なクラスタの背後にある「魔法」はここで見つけることができます.しかし、チュートリアルを探しているなら、ここはもっと似合う場所です.クラスタを選択できない場合は、ネーミングスペースを考えて、keyを複数のインスタンスに分散します.データの割り当て方法についてはredis.ioサイトにはこの素晴らしいコメントがあります.
    9、コアが多ければ多いほどいいですか.
    もちろん間違っています.Redisは単一スレッドプロセスであり、永続化が有効になっていても最大2つのカーネルしか消費されません.1台のホスト上で複数のインスタンスを実行する計画がない限り、テストを開発する環境でのみ実行したいと考えています.そうでなければ、1つのRedisインスタンスに対して2つ以上のカーネルは必要ありません.
    10、高可用性
    これまでRedis Centinelは包括的なテストを経ており、多くのユーザーがObjectRocketを含む生産環境に適用しています.もしあなたの応用がRedisに重度に依存しているならば、それがオフラインにならないことを保証するために高可用性の方案を考え出す必要があります.もちろん、自分で管理したくない場合は、ObjectRocketは高可用性プラットフォームを提供し、7を提供します.×24時間のテクニカルサポート、意向があれば考えてみてください.
    以上、Redisの正しい使い方について10つのテクニックをご紹介しましたので、皆さんの勉強に役立てたいと思います.