1。キャッシュキャッシュとは何ですか
キャッシュという言葉は、最初にCPUデザインから来ました
CPUがデータを読み取ることを望んでいる場合、最初にCPUキャッシュから検索し、すぐにそれを読み取り、見つけた場合は処理のためにCPUに送信します。発見されていない場合は、比較的遅いメモリから読み取り、処理のためにCPUに送信されます。同時に、このデータが配置されているデータブロックがキャッシュに呼び出されるため、メモリを呼び出すことなくデータのブロック全体を将来キャッシュから読み取ることができます。 CPUの読み取りキャッシュヒット率を非常に高くするのはこの読み取りメカニズムです(ほとんどのCPUは約90%に達することができます)。つまり、CPUが次回読むデータの90%がCPUキャッシュにあり、メモリから読む必要があるのは約10%だけです。これにより、CPUの時間を大幅に節約してメモリを直接読み取ることができ、CPUが待たずにデータを読むことも不可能になります。一般に、CPUがデータを読み取る順序は、最初にキャッシュされ、次にメモリをキャッシュします。
その後、最初にハードディスクキャッシュに行き、次にアプリケーションキャッシュ、ブラウザーキャッシュ、Webキャッシュなどに行きました。
キャッシュは王です! !
スプリングキャッシュ
Spring Cacheは、Springアプリケーションで提供されるアプリケーションキャッシュソリューションの完全なセットです。
Spring Cache自体はキャッシュの実装を提供しませんが、統一されたインターフェイスとコード仕様、構成、注釈などを使用して、キャッシュの詳細にあまり注意を払わずにSpringアプリケーションでさまざまなキャッシュを使用できます。スプリングキャッシュを使用すると、簡単に使用できます
concurrentMap、ehcache 2.x、jcache、redisなどを含むさまざまなキャッシュの実装。
春のキャッシュの定義
インターフェイスorg.springframework.cache.cacheを含む、春のキャッシュの定義。
主に次の方法を提供します
//指定されたキー<t> t get(オブジェクトキー、クラス<t>タイプ)に従って値を取得します//対応するキーボイドプット(オブジェクトキー、オブジェクト値)に従って指定値をキャッシュに保存します; //指定された値ボイドevict(オブジェクトキー)をリサイクルします
定義から、キャッシュが実際にキー価値構造であることを確認することは難しくありません。指定されたキーを介して対応する値を操作します。
キャッシュマネージャー
キャッシュはキー価値のコレクションですが、私たちのプロジェクトでは、ユーザーキャッシュ、部門キャッシュなど、さまざまなビジネストピックのさまざまなキャッシュがある場合があります。これらのキャッシュは論理的に分離されています。これらのキャッシュを区別するために、org.springframework.cache.cachemanagerがさまざまなキャッシュを管理するために提供されます。このインターフェイスには、2つのメソッドのみが含まれています
//対応するトピックのキャッシュを取得して、名前Cache getCache(String name); //すべてのトピックコレクションのキャッシュを取得<String> getCachenames();
このインターフェースでは、操作の追加と削除をキャッシュで実行することは許可されていません。これらの操作は、さまざまなCacheManagerの実装によって内部的に完了する必要があり、開示しないでください。
注釈ベースのキャッシュ
理論的には、データのキャッシュ操作はビジネス自体にあまり関連していません。キャッシュの読み取り操作をメインコードロジックから分離する必要があります。スプリングの分離方法は、注釈に基づいています(もちろん、JSR-107などは注釈にも基づいています)。
Springは、 @Cacheable、 @Cacheput、 @Cacheevict、およびその他の注釈を含む一連の注釈を提供し、キャッシュの操作を簡素化します。これらの注釈は、org.springframework.cache.annotationパッケージにあります。
2。例
スプリングキャッシュを使用してスプリングブートを使用する簡単な例
スプリングブートキャッシュに基づいて段階的に例を挙げましょう
新しいスプリングブートプロジェクトを作成し、次の依存関係を紹介します
<dependencies> <dependency> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-cache </artifactid> </dependency> <dependency> <groupid> org.springframework.boot </groupid> <artifactid> spring-webb < <GroupId> org.springframework.boot </groupid> <artifactid> spring-boot-starter-test </artifactid> <scope>テスト</scope> </dependency> </dependencies>
その中で、Spring-Boot-Starter-Cacheはキャッシュの重要な依存関係です。
アプリケーションクラスを変更し、Cache @enableCachingを有効にするアノテーションを追加します
@SpringBootApplication@enableCachingPublic Class cachesimpleapplication {public static void main(string [] args){springApplication.run(cachesimpleapplication.class、args); }}@EnableCacheアノテーションは、Springのキャッシュメカニズムを開始します。これにより、アプリケーションはすべてのキャッシュ関連の注釈を検出して動作を開始できます。また、アプリケーションで注入して使用できるCacheManager Beanも作成します。
新しいRestControllerクラスを作成します
@retscontroller @requestmapping( "/")パブリッククラスCachecontroller {@autowired private cachetestservice cachetestService; / ** * IDに基づいて情報を取得 * * @Param ID * @return */ @getMapping( "{id}")public string test( @pathvariable( "id")string id){return cachetestservice.get(id); } / ** * IDに関する情報を削除 * * @param id * @return * / @deletemapping( "{id}")public string delete( @pathvariable( "id")string id){return cachetestservice.delete(id); } / ** * IDに関する情報の保存} / ** *新しいIDに関する情報 * * @Param ID * @return * / @putMapping( "{id}")public string update( @pathvariable( "id")string id、@requestparam( "value")string value){return cachetestservice.update(id、value); }}このクラスは、追加、削除、変更、チェックの実際の操作を実装するためのサービスを呼び出します。
サービスの実装
次に、サービスを実装したいと考えています
@servicepublic class simplecachetestserviceimpl cachetestservice {private static final logger logger = loggerfactory.getLogger(SimpleCachetestServiceImpl.Class);プライベート最終マップ<string、string> entities = new Hashmap <>(); public SimpleCachetestServiceImpl(){entities.put( "1"、 "this no 1"); } @autowired private private cachemanager cachemanager; @override @cachable(cachenames = "test")public string get(string id){// long time = new date()。getTime()をテストして比較するために使用されるデータ生成時間を記録します。 //使用されているCacheManager logger.info( "CacheManager is" + cachemanager)を印刷します。 // log logger.infoを印刷する( "ID =" + id + "で値を取得、時間は" + time); return "ID =" + id + "で値を取得し、値は" + entities.get(id); } @Override public String delete(string id){return entities.remove(id); } @Override public String save(string id、string value){logger.info( "save value" + value + "with key" + id); entities.put(id、value);返品値。 } @Override public String update(string id、string value){return entities.put(id、value); }}キャッシュ
まず、@CachableアノテーションをGETメソッドに追加し、コードテストを実行します。
テストには郵便配達員を使用します。テストアドレスはhttp:// localhost:8080/1です。ブラウザは応答してID = 1で値を取得します。
ID = 1で値を取得し、値はid = 1で値を取得します、時間は1516004770216です
しかし、ブラウザアドレスを再度更新すると、ブラウザは正常に返されますが、コンソールは印刷されなくなります。その理由は、私たちがそれを2度目に呼ぶとき、Springはメソッドを実行するのではなく、キャッシュされた値を直接取得するからです。スプリングキャッシュは、テストという名前のキャッシュのキーとして関数の戻り値をキャッシュします。
ここでは、@Cachable Annotationを使用します。注釈のキャッシュ名は、ここで読み取られるキャッシュを指定します。ここでは、cachename = "test"のキーがIDであるキャッシュオブジェクトを検索します。
キャッシュされたデータを削除します
上記のプログラムでは、削除要求を介して指定された値を削除し、削除要求をhttp:// localhost:8080/1に送信すると、この時点でマップから値が削除されますが、http:// localhost:8080/1にリクエストを取得すると、値を取得できます。これは、データを削除すると、キャッシュ内のデータが削除されなかったためです。以前のGETメソッドでは、メソッドの操作結果は引き続き保存されています。 Springは読み直されませんが、キャッシュを直接読み取ります。この時点で、メソッドの前に注釈を追加します
@override@cacheevict(cachenames = "test")public string delete(string id){return entities.remove(id);}テスト後、最初にget requestを呼び出すと、return値はID = 1でGet値として正しく表示されます、値は1です
次に、削除要求を呼び出します。キャッシュとマップからデータを削除し、GETリクエストをもう一度呼び出します。この時点で、ID = 1によるGET値は、値はnullです。つまり、値は実際にキャッシュから削除されています。
ここでは、@cacheevict annotationを使用します。 Cachenamesは、削除するデータをキャッシュするかを指定します。デフォルトでは、メソッドパラメーターは削除されたキーとして使用されます。
キャッシュを更新します
プログラムがこのポイントに到達した場合、POST要求を実行すると、リクエスト本体はID = 1&値= new1です。現時点では、コンソールはキー1を含むnew value1を保存し、コードはマップに値を保存しますが、Get Requestを実行すると、返品値はまだ前の状態にあることがわかります。これが私たちが使用できるものです
@override@cacheput(cachenames = "test"、key = "#id")public string save(string id、string value){logger.info( "save value" + value + "with key" + id); return entities.put(id、value);}コードを再検討すると、最初に削除要求を送信して、マップからデータを削除してキャッシュを削除します。次に、投稿リクエストを送信し、データをマップに書き込みます。最後に、GETリクエストを送信すると、値を正しく取得できるようになり、コンソールがマップから取得したデータのログを印刷しないことがわかります。
@cacheputアノテーションはここで使用されています。この注釈の機能は、メソッドの返品値を、指定されたキーに従ってCachenamesで指定されたキャッシュに書き込むことです。
同様に、変更がキャッシュされたデータも更新できるように、@CachePutアノテーションをPUTメソッドに追加する必要があります。
この時点で、追加、削除、変更、クエリなどの簡単なキャッシュアプリケーションが完了します。
3。キーポイント
いくつかのメモ
知らせ
@Cachableと@CachePutは、指定されたキーに従ってメソッドの実行結果をキャッシュに入れます。 @Cachableが実行されると、まずキャッシュにデータがあるかどうかが検出されます。その場合、キャッシュから直接読み取られます。そうでない場合は、メソッドを実行して戻り値をキャッシュに入れます。 @cacheputは最初にメソッドを実行し、次に実行結果をキャッシュに書き込みます。 @cacheputを使用した方法は間違いなく実行されます
完全なサンプルコードはhttps://github.com/ldwqh0/cache-testにあります
要約します
上記は、編集者が紹介したSpring Bootでキャッシュキャッシュを使用する方法です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!