要約:
春3.1は、あなたが再びメソッドを呼び出すときにキャッシュがある場合は核となるアイデアは、キャッシュされたキー/値として、開発者がメソッドを呼び出す方法、メソッドのパラメータと戻り値をキャッシュされ、キャッシュのサポートを提供するために開始しますキャッシュから直接入手可能なデータは、そうでない場合はこの方法を実行するために行きます。しかし、春はキャッシュでの実装を提供していませんが、提供する - セットキャッシュAPIは、開発者がキャッシュを実装するために自由に選択できます。
次のように春ブーツは、現在、要約されているキャッシュをサポートしています::
JCacheの(JSR-107)
にehcache 2.xの
Hazelcast
Infinispan
のCouchbase
のRedisの
カフェインの
シンプル
使用します。
pom.xml
< 依存性> < のgroupId > org.springframework.boot </ のgroupId > < たartifactId >ばねブートスタータキャッシュ</ たartifactId > </ 依存> < 依存性> < のgroupId > org.springframework.boot </ のgroupId > < たartifactId >春・ブート・スターター・ウェブ</ たartifactId > </ 依存関係> < 依存> <groupId >net.sf.ehcache </ のgroupId > < たartifactId > ehcacheを</ たartifactId > </ 依存> < 依存性> < のgroupId > org.springframework.boot </ のgroupId > < たartifactId >ばねブートスタータデータRedisの</ たartifactId > </ 依存関係>
Encacheプロフィール:ehcache.xml
これは、通常のEhcacheのプロファイルが提供される2つのキャッシング戦略、ブック_CACHEと呼ばれる別のグループのデフォルトを。
一つは、名前はキャッシュの名前を表します。
maxElementsInMemoryは、キャッシュの最大数を表します。
etemalキャッシュは永続オブジェクトかどうかを示す、セット一度永久、timcoutは動作しません。
timeToldleSeconds(単位:秒)で障害が発生する前にアイドル時間を可能にキャッシュオブジェクトを表すオブジェクトが永久的etermalない場合、このプロパティは有効になり、。
timeToLiveSeconds故障生存時間(単位:秒)前に許可さキャッシュオブジェクトを表すオブジェクトが永久的でない場合、属性が有効になる永遠の偽:
overflowToDiskのメモリ内のオブジェクトの数、オブジェクトがディスクに書き込まれているかどうかmaxElementsInMemory、Eheacheに達したことを意味します。
diskxpiryTheadntervalsecondsは、ディスク障害スレッドの実行間隔を示しています。
< ehcacheを> < diskStore パス= "java.io.tmpdirの/キャッシュ" /> < defaultCache maxElementsInMemory = "10000" 永遠= "false"を timeToIdleSecondsなど= "120" timeToLiveSeconds = "120" overflowToDisk = "false"を diskPersistent = "false"を diskExpiryThreadIntervalSeconds = "120" /> < キャッシュ名= "book_cache" maxElementsInMemory =」10000" 永遠『=』真 timeToIdleSecondsなど= "120" timeToLiveSeconds = "120" overflowToDisk = "true"を diskPersistent = "true"を diskExpiryThreadIntervalSeconds = "10" /> </ ehcacheを>
キャッシュを開く:コメントを@EnableCaching
@SpringBootApplication @EnableCaching パブリック クラスCacheApplication { 公共 静的 ボイドメイン(文字列[]引数){ SpringApplication.run(CacheApplication。クラス、引数)。 } }
エンティティクラスとサービスを作成します。
パブリック クラス帳実装Serializableを{ プライベート整数ID。 プライベート文字列名; プライベート文字列の作者。 ..... }
@Service @CacheConfig(cacheNames = "book_cache") パブリック クラスBookDao { @Autowired MyKeyGenerator myKeyGenerator。
@Cacheable(するKeyGenerator = "myKeyGenerator") 公衆ブックgetBookById(整数ID){ するSystem.out.println( "getBookById" )。 ブックブック = 新しいブック(); book.setId(ID)。 book.setName( "三国演义" ); book.setAuthor( "罗贯中" ); リターン・ブック。 } @CachePut(キー = "#1 book.id" ブックupdateBookById(ブックブック){ System.out.printlnは( "updateBookById" ); book.setName( "三国演义2" )。 リターン・ブック。 } @CacheEvict(キー = "#ID") 公共 ボイドdeleteBookById(整数ID){ するSystem.out.println( "deleteBookById" )。 } }
サービス層に追加@CacheConfigのノートに直接@CacheConfig注釈を使用せずに、このオプションの設定、名前キャッシュの使用を示す@Cacheableキャッシュ名アノテーションを指定します。
方法getBookByIdの上でキャッシュする方法を示す@Cacheable追加注釈、メソッドのデフォルトのキャッシュキーパラメータは、戻り値は、キャッシュ方式の値です。開発者が他のクラスでこのメソッドを呼び出すと、その場合は、最初、キャッシュされたデータを直接使用がキャッシュ内のビューデータにパラメータを呼び出し、そしてかどうかに応じて、この方法は実行されない、またはメソッドを実行するために、成功したリターンの実施後値をキャッシュし、それは現在のクラスのメソッドを呼び出すことであれば、キャッシュが有効になりません
@Cacheableアノテーション性及び条件キャッシュ実行タイミングを説明するために使用される、例えば@Cacheable(状態=「#IDは%は 2 = = 0」) 0モジュロ2のIDがキャッシュ、またはしないが、キャッシュされた場合を示している場合。
開発者は、デフォルトのキーを使用したくない場合は、できるカスタマイズキー、キー=「#1 book.idは、」キャッシュオブジェクトidパラメータの簿価のためのキーを表すキー=「#IDを」キャッシュキーパラメータIDを表します。
キーパラメータ定義のこの実施形態を使用することに加えて、春は提供ルートオブジェクトであるようなテーブルとして、鍵を生成するために使用されます。
方法はノートは、一般に、データ更新方法のために使用される@CachePut、及び@Cacheable異なるノート、注釈は@CachePutは、キャッシュ内のデータがあるかどうかチェックしないたびに実行加え、その後直接実行方法、実行方法データを対応するキーがキャッシュされている場合はキャッシュの結果は、それがデータを再ロードされたときにダーティなデータを取得するために避けるために、以前のデータを上書きします。一方、CachePutと@Cacheable @ここではそれらを繰り返さないで、同様の属性を持っています。
deleteメソッドのための@CacheEvict注意事項一般的には、対応するキャッシュを削除するキーを表します。@CacheEvictノート二つの特別な属性がありますallEntriesとbeforeInvocation、allEntriesは全てのキャッシュされたデータが削除されたかどうかを示し、デフォルトはfalseで、beforeInvocationは、メソッドの実行前にキャッシュ内のデータを削除するかどうかを示し、デフォルトでは、あること、虚偽でありますメソッドの実行後のデータ・キャッシュを削除します。
テスト:
@RunWith(SpringRunner。クラス) @SpringBootTest パブリック クラスCacheApplicationTests { @Autowired BookDao bookDao。 @Test 公共 ボイドcontextLoads(){ bookDao.getBookById( 1 )。 bookDao.getBookById( 1 )。 bookDao.deleteBookById( 1 )。 本B3 = bookDao.getBookById(1 )。 System.out.println( "B3:" + B3)。 ブックB = 新しいブック(); b.setName( "三国演义" ); b.setAuthor( "罗贯中" ); b.setId( 1 )。 bookDao.updateBookById(B)。 本B4 = bookDao.getBookById(1 )。 System.out.println( "B4:" + B4)。 } }
コンソール:
getBookById
deleteBookById
getBookById
B3:{予約ID = 1、名前= '三国志'、著者= '羅貫中' }
updateBookById B4:{予約ID = 1、名前= '三国志'、著者= '羅貫中'}