プログラミングを学ぶために5分:バックエンドエンジニアを習得する方法は、キャッシュがなります知っているのだろうか?

元の文

この記事は、最初の[プログラマ]斜め黄公共マイクロチャンネル番号に登場します

著者:黄斜め

復刻版は、資料の冒頭にソースと作者を明記してください。

この記事マインドマッピング

キャッシュとは何ですか

コンピュータのキャッシュ

学生のバックエンドの開発を行い、おそらくキャッシュは通常、我々はいくつかのバックエンド・アプリケーションを実現するために、Redisの、Memcacheのキャッシュコンポーネントのこのタイプ、またはローカルキャッシュを使用することができ、精通していません。

だから、厳密に言えば、それをキャッシュされているものを最後に、定義Baiduの百科事典での外観をしましょう。

キャッシュ(キャッシュ)、より高速なランダムアクセスメモリ(RAM)の高速メモリよりも一般的なアクセス速度を参照するために、本来の意味は、それが一般的にシステムのメインメモリDRAM技術、高価なより高速なSRAM技術の使用として使用されていません。キャッシュの設定は、再生するすべての近代的な高性能コンピュータシステムにおける重要な要因です。

相互作用を直接CPUとメモリは、そのようにして、CPUの計算時間の多くを無駄にあればスピードのギャップを計算するCPUとメモリは、大きすぎるため、最初は、用語「キャッシュ」は、コンピュータのハードウェアキャッシュを参照するために使用されますスピードへのキャッシュは、二つの成分が仲介行う程遠いです。

その後、具体的な作品、CPUが失うも過言ではないパフォーマンスを行いますので、理由は彼ら二人の間の速度のギャップの、誰かを見つけるために、データ・キャッシュを取るためにCPU時間は、大きくはない、データがキャッシュにある場合、直接、次回に取得するために、テイク完全な後にそれ以外のメモリをフェッチするために、キャッシュを取るだけでなく、キャッシュに滞在した後、CPUのメモリを使用する必要はありません。

実際には、キャッシュはまた、すべてのレベルに至るまで、その上のキャッシュ、L2キャッシュ、および3レベルのキャッシュに分けることができ、低速では、価格を下げ、すべての後に、コストは我々が考慮しなければならない要因はに、ありますそうでない場合は、すべてのすべてのハードウェアを備えた上で、ソフトウェアの最適化を議論する必要はありません。

キャッシュに加えて、ハード・ディスク・キャッシュは、キャッシュを達成するために、ネットワークオペレーティングシステム自体をキャッシュもあり、その目的は、2つの異なる動作速度成分との間のブリッジを構築することであり、データキャッシュ多くの場合、ローカルデータであり、ホットデータとして知られている、データのこの部分は、しばしば使用され、したがってより多くの値をキャッシュします

ソフトウェア開発キャッシュ

すでにキャッシュ内のコンピュータについて少し話をした上で、我々は通常、コード開発に使用されるキャッシュは、それが何であるのですか?それは同じああではないようです。

私は、我々は業界で最も人気のあるキャッシュ・コンポーネントの一つであるRedisのを、聞いたことがあると信じて、それがどのように定義されるかを見てみましょう。

Redisのキーと値のストレージシステムです。ハッシュ(ハッシュタイプ) - と同様にMemcachedのは、文字列(文字列)、リスト(一覧)、SET(セット)、ZSET(順序集合ソートセット)を含む、比較的保存された値の型をサポートしています。これらのデータ型は、プッシュ/ポップ、追加/削除し、交差点や労働組合に、その差豊かな操作をサポートしており、これらの操作はアトミックです。

これに基づき、仕分けの異なるさまざまな方法をサポートするのRedis。memcachedのと同じように、効率性を確保するために、データはメモリにキャッシュされています。Redisの差は、定期的にディスクに書き込まれたデータで更新されたり、追加のログファイルを書き込む動作を変更するために、そしてこれに基づいてマスタースレーブ(マスタとスレーブ)の同期を実現します。

上記の説明によると、私たちが見ることができる、Redisのは、ストレージシステムのK / Vであり、それがメモリにキャッシュされたデータである、我々はすべて知っているが、ハードディスクメモリは、はるかに速い速度よりもあり、通常は常に我々使用データベースは、本質的には、IO操作を読み書きするために、各データベースを通過するのは難しい作業するハードディスクIOに基づいています。

だから、時間データベースメモリを読み書きするために消費するには、はるかに遅い読書よりも、私たちは言う、CPUとキャッシュメモリの読み取りと書き込みの速度差はので、ここで、また、Redisのキャッシュ素晴らしいですし、同じ役割を果たした、唯一のしかし、ハードウェア、ソフトウェア、メモリとCPUの接続は、他の接続されたディスクとメモリです。

Redisのに加えて、キャッシュメモリキャッシュなどの多くのコンポーネントは、アクセスレートのアプリケーションを改善するために、ホットデータキャッシュデータベースによって、達成するために、このように基づいてありますが、それは、バックエンドのアプリケーション開発では非常に一般的な技術です。

キャッシング技術を習得する方法

バックエンドの開発エンジニアとして、私はあなたが毎日のCRUDは、少なくともローカルキャッシュにそれを使用することである場合でも、キャッシュが動作しません理解していません。

また、インタビューはキャッシュ、単純なポイントのしばしば問題の側面は、あなたが基本原則と実装のRedis、より複雑についてお話させて頂く場合がございますので、シーンと組み合わされる、キャッシュを生じる可能性があるあなたにいくつか質問をして、またはどのように分散キャッシュデザインシーンインチ

同じ原理から学ぶキャッシングや他の技術を学び、高度な使用法を学ぶために、理解するために使用されます、あなたは最初に簡単な問題を必要とする、のは、このタフな小さなエルフのキャッシュを取得する方法を見てみましょう。

ローカルキャッシュCHM

まず、実際にはキャッシュに接触し、私はハッシュマップを知ったとき、ハッシュマップ自体はKVの主要な対象であり、我々は今言ったが、本当に実際には、それのキャッシュになるハッシュマップ作成する方法、そして、少しのRedisのように思えます、難しいです。

実際には、ローカルキャッシュの多くは直接達成するためのConcurrentHashMapされ、注意、同時に良い状況を置けば、ああ、キャッシュされたオブジェクトは、同時にアクセスできる複数のスレッドをサポートすることができますので、ここでは、これは、サポート同時のConcurrentHashMapで、それはあります使用のConcurrentHashMapは、この問題を回避することができるように、例外があるかもしれません。

便宜上、後でConcurrentHashMapのCHMに言及しました。CHMだけでなく、彼らのアクセスはスレッドセーフである、というようにsynchronizedキーワードを直接使用するよりも効率的かつ柔軟に確認してください。

だから、それは何のchmファイルは原則をキャッシュ実装するのですか?まず、アプリケーションでは、本質的にはいくつかのデータは、多くの場合、メモリ内に存在してキャッシュすることで、メモリは、Javaヒープメモリとスタックメモリに分けることができ、キャッシュオブジェクトは当然であるヒープメモリに配置します。

だから、このような変数のクラスのメンバーです。

private Map<String, CacheObj> CACHE_OBJECT_MAP = new ConcurrentHashMap<>();

しかし、キャッシュのこの使用は、インスタンスが初期化されていないか、回収された場合、メンバ変数のインスタンスに属している問題があり、その後、キャッシュオブジェクトもそれで消え、それは確かに、すべての後に、キャッシュのライフサイクルは限りアプリケーション自体としてあるべきではありません加えて、このキャッシュオブジェクトも修正することができ、例えば、私は簡単にそれが許可されていないとして、それは、ヌル=、またはそれを再初期化させ、コードのビットを操作することができます。

そのため、標準CHMローカルキャッシュを初期化するようにする必要があります。

private static final Map<String, CacheObj> CACHE_OBJECT_MAP = new ConcurrentHashMap<>();

それはヒープメモリに存在していたが、それは、最終的なキーワード修正が再初期化または他のオブジェクトへのポインタであってもよいではないことを保証するために静的変数。

次のことは、限り、あなたはそれにgetおよびputメソッドを使用して、簡単です。もちろん、これが唯一の最も基本的なローカルキャッシュ実装でも、LRUキャッシュとして実装することができませんサン作業の多様に従事、我々はもはや、具体的に議論されている場合、多くのオンラインデモを参照に行く自由があります。

一般的なキャッシュコンポーネント戦闘

ローカルキャッシュに加えて、我々はまた、Redisの、キャッシュコンポーネントのmemcacheのタイプとして一般的に使用されるキャッシュ技術のいくつかを知ってもらう必要があり、外部キャッシュのJavaキャッシングフレームワークの似たようなものがあります。

どのようにデータの同期、マスタースレーブ我々は習得して使用することができ、彼らは一般的に、分散、高可用性を展開する方法は、そのようなホット・データに対処する方法として、様々なシナリオの下で高度なソリューションを提供することが可能であるより多くのことをこのような高度なキャッシング技術、コピー、および各シーン分散ロックのアプリケーションの実現、世代IDなどを配布しました。

そこで私たちが遭遇していると信じていた顔の質問があり、それは、我々は最終的に、彼らがどのような特性である、見つけるために、この顔の質問を採用することを望むかもしれないあなたはmemcacheのとRedisのを頼む違いです。

Redisのは、それがより広いアプリケーションシナリオを有するように、データの単純なK / Vタイプをサポートし、また、ストレージ・リストをサポートし、セット、ZSET(ソートセット)、ハッシュデータ構造、等。

Memcachedののみサポートされているデータ型は、文字列の文字列である文字列は、追加治療を必要としないため、読み取り専用のデータ・キャッシュに最適です。

Redisの最大の明るいスポットが支援データの永続性にあり、それが停電した後、ディスク、または再起動にデータをバックアップすることができ、実行時に、キャッシュされたデータは、基本的には、データを失うことなく、合理的なRedisの構成限り、再びメモリにロードすることができます。

永続的でないデータなら、これはひび割れの電源障害が発生した場合には、memcacheのひどいです。

同時実行シナリオでメモリキャッシュ、CASは一貫性を確保することができ、そしてRedisのトランザクション・サポートは、トランザクションの動作の各連続実行を確実にするために、比較的弱いです。

Redisのサポートサービスとmemcacheのはサポートされていませんが、劣らずのRedisよりmemcacheのはサポートしないようにけれども。

パフォーマンスは、読み取りおよび書き込み操作のRedisのは少し先のMemcachedのです。MemcachedのRedisのメモリ管理はそう、メタデータのメタデータより小さく、比較的に言えば、非常に少ないオーバーヘッドは複雑ではありません。

システムデータの場合は、場合でも、それは問題ではないでしょうバックアップするデータはありませんが、読み取りおよび書き込みすることがあれば、その後、明らかにmemcacheのは、全体として、Redisのは適切ではない、またはわずかに良いです。

Redisのキャッシュコンポーネントは、他のキャッシュ・コンポーネントが外部キャッシュしながら、実際、C / Sモードを介してそのようなサービスを展開されて、直接私達のローカル・キャッシュに幾分類似JVM上のキャッシュされたデータが、実際には、また、外部キャッシュを適用することが、一体化されています休止状態では、私たちは無意識のうちにいるように多くの時間が使用されたキャッシュされています。

もちろん、JVM上の外部キャッシュなどのキャッシュされたデータには、あなたは、分散アプリケーションのシナリオで必要な場合には特に、より実装するのに複雑であり、そしてより多くの悩み、それを共有したいです。

原則キャッシング

私はあなたがローカルキャッシュの一部を読んだときに、キャッシュは、実装がより困難何も、ああ、ハッシュマップの取得を感じないだろうと信じています。

、実際に考慮すべき、キャッシュ実装の問題は依然として多く、彼らはRedisのを取ったので、データを格納するためにデータ構造は非常に重要な問題であるものを使用して、我々は確かに多くのデータとしてストアに小さなスペースとして使用したいと考えていますしかし、キャッシュCRUDの効率を向上させます。

Redisのは、など、そのような文字列、配列、辞書(マップ)だけでなく、リストなどのデータ構造、セットの様々なサポートのセットを注文し、データ構造を見ていない非常にシンプルですが、著者は多大な労力を実装する必要があります。

多くの場合、目的を達成するために、複数の基本的な構造は、効率を改善し、圧縮空間にあります。興味のある友人はhttps://blog.csdn.net/Future_LL/article/details/88525004を達成するために、この記事Redisのデータ構造の一番下に見ることができます

データ構造に加えて、Redisの自体は、例えば、またデザインは、ほかに、Redisのは、そこのRedisトランザクションが達成するためにどのような設計でなければならない理由は、シングルスレッド化作業、どのように、Redisのサービスとクライアント面白いです達成するためにこれらの内容は、学ぶために価値がある11。

いくつかの高度な内容も公式のRedis Redisのクラスタの高可用性クラスタソリューションを持って、多くの場合など、マスタ・スレーブ展開クラスタソリューション、HAプログラムを含め、このようRedisの展開シナリオとして、もあります。Redisのも頻繁に分散ロック、分散IDジェネレータのために使用されるが、これらの技術の後ろに、実際には、我々は深いポイントを掘ることができる多くのことを持っています。

時間は、私たちはキャッシングと開始するために、この記事から学ぶために今日ここに、Redisのを停止します。

ブログ

Javaテクノロジの蔵の「Javaプログラマーズ・ガイドの口コミ」

https://github.com/h2pl/Java-Tutorial

Javaは基本から高度なJavaの系統的レビューにあなたの助けに高品質の学習コンテンツのネットワーク全体を統合しました

インタビューガイド

ネットワーク全体最もホットなJavaのインタビューガイド、非常に実用的な200以上のページ、合計、レビューのためか、面接の準備をするかどうかは良いです。公共の川や湖でのJavaテクノロジは、[いいえ]自由を受けるために、「PDF」を返信します。

最後に書かれました

あなたはあなたにこの記事が参考に思うなら、あなたは「良い」ハを意味するものではありませんが、友人の前方円が私の最大のサポートあなたです、あなたのサポートが私の最大の励ましです。

この一連の記事上の任意の提案やコメントは、コメントはあなたのフィードバックを楽しみにして、私に教えても歓迎されています。

-----------------------

公開番号:プログラマー黄斜め(ID:AntCoder

ブログ:www.how2playlife.com

ほとんど知っている:黄ランププログラマーを

駅B:黄ランプ(注意を求めて)

私たちは、自己学習プログラムへのより多くの人々のために簡単にそれを作ることを約束男性に魚を与える、だけでなく、釣りを与えます

私の2年間の仕上げ学習教材を受信するマイクロチャネル公共番号[プログラマ]は黄斜め返信「2019」に焦点を当て

カバーなど基本的なコンピュータや研究セクション8000Gデータ収集などの自己プログラミング、就職の面接、Java技術、アルゴリズム、ブラシの問題、。

公開された293元の記事 ウォンの賞賛1597 ビュー123万+

おすすめ

転載: blog.csdn.net/a724888/article/details/104832428