1.キャッシュとは何ですか
多くのキャッシュ、CPUキャッシュからキャッシュ、ディスク・ツー・ブラウザのキャッシュなどがありますが、私たちは主にバックエンドシステムキャッシュのために、本明細書キャッシュを言及しました。それは多くの場合、あなたはすぐに、データのロードを回避することができ、使用中に電話または重複するインスタンスを作成し、オーバーヘッドの削減、システムの効率を向上させる目的を達成することができるようにメモリに使用するオブジェクトプログラムまたはシステムです。
2.なぜ使用キャッシュ
私たちは通常、関係なく、データベースのパフォーマンス、単純なクエリもミリ秒の時間を消費するので、私たちはしばしば、QPSは、データベースのパフォーマンスによって制限されるだろうと言って、私たちが望むどのように良い、リレーショナルデータベースに格納されたデータを入れていませんQPSを向上させる、唯一のより高速なストレージデバイスを選択することができます。
このようなシナリオの日々の開発で:一部のデータがそうであるデータの量、頻繁に変更が、アクセスは非常に頻繁ではありません。その理由は、ハードディスクIO性能やリモートネットワークによって制限され、それぞれに直接アクセスは、リソースを大量に消費しています。私たちの応答が遅く、あるいは容認することはできません一部の企業では、このような問題を解決するために、キャッシュされた人工物であるシステム圧力をもたらすためにつながる可能性があります。
しかし、もう一つ注意すべきは、キャッシュ領域とキャッシュの有効期限ポリシーは、以下に述べることです。
3.キャッシュされたシーンを使用します
キャッシュの場合、データはほとんど変化しないとより頻繁に問い合わせが最高のシナリオで、量が足りないか、クエリデータがあまりにも頻繁に変更された場合、キャッシュは無意味です。
キャッシュの毎日の使用は、内部キャッシュおよび外部キャッシュに分けることができます。
内部キャッシュは、一般に、実行中のインスタンスを意味し、内部キャッシュメモリの使用例に格納され、そのようなコードは、直接キャッシュにアクセスするために使用することができます。
一般的に、典型的には、ネットワークを介して、デシリアライゼーション後のアクセスを取得し、外部キャッシュ動作例に格納された外部キャッシュを指します。
内部キャッシュは簡単にアクセスし、良好な性能を持っているので、例えば、それは一般的な間の同期を必要とせず、複数の内部キャッシュは、推奨されています。インスタンス間でデータを同期させる必要は外部キャッシュを使用することができます。
ここでは、キャッシング、これらの2つのタイプが導入されています。
3.1内部キャッシュ
なぜ内部キャッシュの場合
システムでは、いくつかの小さなデータはほとんど変化しないが、アクセスは、このような、地方の自治体や地区のデータとして、非常に頻繁にあります。このシナリオの観点から、アプリケーションは、データベースやネットワークへの不要なアクセスを減らすこと、システムのアクセス効率を向上させるために、メモリにデータをロードすることができます。
内部JVMに、すべての後に、メモリ容量を超えることができない内部キャッシュに格納されるデータの量を制限します。
最も簡単な内部キャッシュ - 地図
強力な内部キャッシュ - グアバキャッシュ/カフェイン
グアバ基本的な原理は、ローカルキャッシュにある:のConcurrentMap + LRUアルゴリズム(セグメント化されたロックロックの粒度の減少を使用)。
利点のローカルキャッシュ:
-
メモリ、スピードを使用せず、通常千万アクセス性能がレベルごとに達成することができます
-
Javaオブジェクトには、直接アクセスを使用することができます
ローカルキャッシュの欠点:
-
現在のインスタンスに格納されたデータは、共有することができません
-
再起動したアプリケーションが失われます
グアバキャッシュ置換カフェイン
春5カフェインは、パフォーマンスの観点から、グアバのキャッシュは、考慮しなければならない代わりに使用します。多くのパフォーマンステストではカフェイングァバよりも優れていることが、パフォーマンスのすべての側面を確認してください。
カフェインの操作APIの機能やグアバは基本的に一致している、とグアバ、グアバはアダプターを作っ前にカフェインは、ユーザーと互換性があるように、それはまた、非常に親密です。
あなたがもっと知りたい場合は、を参照してください。春5は、グアバキャッシュの使用を放棄し何が?
3.2外部キャッシュ
Redisの/ memcachedの - 外部キャッシュの中で最も有名な
Redisのは、おそらくあまりにもよく知られており、キャッシュの単なる言及は基本的にRedisのについて話します。しかし、実際にはキャッシングMemcachedのLiveJournalの発信のこのタイプが開発されるべきです。
ストレージの使用などのRedis / MemcachedのメモリはそれほどのRedisと相まって、データベースのパフォーマンス、よりもはるかに優れている質の高い宿泊サービスを提供しても、また、非常に使いやすいです、データ構造の多様性をサポートしています。
Redisのは本当に良いが、メモリを用いても、それはまだ、ネットワーク経由でアクセスする必要があるので、ネットワークのパフォーマンスは、レイズの性能を決定します。
私は、キーまたは値の長さ以上使用する場合は、取得し、約10ワット秒あたりの設定の20バイト文字列の長さでキーと値のためのギガビットNICの場合には、いくつかのパフォーマンステストを行っていますデータ構造は、これは遅くなります。
一般的なシステムが十分以上のものを持っているように使用、今のところ、Redisのは本当にシステムキャッシュに適合します。
あなたが配布またはマルチ・インスタンスを考慮した場合、次の方法を検討してください。
-
JedisのShardedJedis(彼のスライスを実現するために終了するために呼び出します)
-
twemproxy / CODIS(サードパーティ製のコンポーネントの実装機関)
-
Redisのクラスタ(公式3.0後のクラスタプログラム)
これらのプログラムは、独自の特徴を持っている、これは最初の議論ではありません、最初に見えることができます興味を持って。
Redisのは、多くの利点があります。
-
これは、分散データ・パーティショニングを行うのは簡単です、あなたは能力の多くを行うことができます
-
ベースを使用して、比較的大きな、より成熟したライブラリです
同時に、いくつかの欠点もあります。
-
Javaオブジェクトのシリアライズは、保存する必要があります
-
サーバーが再起動されている場合は、それが永続的である場合でも、データの永続性をしない場合を失うことになるにも、さまざまな問題を起こしやすいです
4.キャッシュ更新ポリシー
キャッシュを使用する場合は、更新戦略が非常に重要です。最も一般的な戦略はキャッシュのキャッシュを更新するために脇柄です。
-
失敗:、データキャッシュを取り始めるために得ることはありません、データベースから、成功の後、キャッシュにデータをフェッチするアプリケーション。
-
ヒット:復帰後に採取されたキャッシュからのデータへのアプリケーションアクセスを。
-
アップデート:データベースにデータを入れて、成功した後、キャッシュの無効化をしましょう。
内部キャッシュおよび外部キャッシュするかどうかを、システムがキャッシュをサポートしている場合は、この更新戦略を使用することができ、キャッシュが有効期限を設定することで更新することができます。
その他のアップデートポリシーは、このキャッシュの更新ルーチンのマウスの左耳に参照することができます。
5.よくある間違いキャッシュ
プログラムのシーケンスを選択します
選択肢の直列化は、あなたが通常の直列化復元を変更することができない場合、ネイティブの配列は、バージョンを確認するためにserialVersionUIDの依存しているため、Javaのネイティブメカニズムを使用しないようにしてみてください。
JSONまたはヘッセ、いるProtobufおよびその他のバイナリモードを使用することをお勧めします。
ラージオブジェクトキャッシュ
キャッシュアクセスに大きなオブジェクトを格納するコストが高いです。実際の使用、多くの場合、単にそれらのいくつかを必要とするが、これはすべてがより多くのメモリ、およびネットワークリソースを消費するために読んで毎回つながる、それがキャッシュ容量の無駄になります。
もちろん、毎回完全なオブジェクトならば、これは問題ありません。
データ共有のためのキャッシュを使用してください
システムは目に見えない依存性の間で生成され、また、多くの場合、問題が発生し、いくつかの競争を有していてもよく、でも仕方プロセス、スレッド間でデータを共有するためにキャッシュとして使用します。データを共有するためにこの方法を使用することは推奨されません。
期限切れのキャッシュまたは無効なデータがあり更新はありませんまたは削除します
これは、タイムリーに更新または削除されていない場合、間違っている事業で、その結果、誤ったデータを読み出すことが可能である、理解することは非常に簡単です。
キャッシング・システムのサポートが有効期限を設定し、有効期限は、このような事態を回避するために、それぞれのデータに適し提供されてもよいです。
6. libshmcacheはじめに
libshmcache利用シナリオ
キャッシュの下で必要なデータの量は、100ワットのキーを超えないように、あまり大きくない場合は、キャッシュの読み書き性能要件を、ケースには比較的高い、使用することを検討してください
:githubの、アドレス上でホストされているBSDのために使用さlibshmcacheオープンソースライセンス、https://github.com/happyfish100/libshmcache