SpringBootでのEhcacheの使用
もし私のコメントに問題があったらコメントで教えてくださいありがとうございます!🙇♂️
すべてのコードはGithubで管理されています.
必要な時に確認すればいいです😊
まず、キャッシュを使用してデータを取得する理由が分からない人について簡単に説明します.
デフォルトでcacheを使用してデータをインポートする理由は
データベースの負荷を削減しながら、データ・クエリーの時間を短縮
快適なサービスを提供することにあります.
しかし、不適切な使用をすると、望ましくないデータが発生し、信頼性が低下する可能性がある.
使用する場合は、慎重に使用してください.
classpathのehcacheとしてdefaultを使用します.xmlを探しに行くと言って、私は明確に指摘して、次回見る時も混同せずにパスを設定しました.
ymlファイルはmain/resourcesパッケージにあります
コードを記述する前に、
次に、宣言は、キャッシュに関連する宣言(
MemberController.java
キャッシュのテスト、キャッシュなし、キャッシュの削除などの方法があります.
MemberService.java
これは、キャッシュ・クエリー・データを使用することを意味します.
ここでkeyは、メソッドパラメータnameを使用することを意味する.
すなわち,nameによって個別にキャッシュされる.
キャッシュされていない場合は、キャッシュされているかどうかを確認し、データを取得してキャッシュします.
キャッシュの場合、キャッシュされたデータが返されます.
@CacheEveit(value="findMemberCache",key="#username")は、キャッシュ内容がクリアされることを示します.
キャッシュデータを更新する必要がある場合、
キーに基づいてキャッシュを選択して削除できます.
キャッシュクエリを使用する論理とキャッシュされていない論理との間のパフォーマンスを比較するためのslowQueryというメソッドが追加されました.
大量のデータが存在すると仮定し、クエリーごとに2秒以上かかります.
slowQueryはthreadを2秒間休眠させるため、
この場合、実行速度の違いを比較してみましょう.
各クエリーには2秒以上の実行時間がかかります(上にクエリーが切断されていますが)、クエリーが終了するたびにクエリーが終了するかどうかを判断できます.
最初のクエリにはキャッシュされていないデータがあり、実行時間は2秒を超え、クエリは停止しました.
1回目のクエリから2秒もかからず、クエリも必要なく、データをインポートするかどうかを確認できます.
データベースに格納されているデータが更新されると、キャッシュされたデータも再格納されます.
この場合、既存のキャッシュデータを削除します.
を選択してもアクセスできます.
キャッシュが完了してから再キャッシュするのに2秒以上かかり、クエリが終了したことを確認できます.
その後、キャッシュされたデータの再取得も確認できます.
同じキャッシュがキーに基づいて別々にキャッシュされているかどうかを確認します.
quxogusのリクエストとtestのリクエストがそれぞれキャッシュされ、管理されていると判断できます.
頻繁に変更されるデータほど、キャッシュを慎重に選択する必要があります. データの整合性が損なわれることを懸念している. データ・クエリの複数の場所にキャッシュを適用するには、メモリのメモリ量も考慮する必要があります. この部分は、キャッシュのライフサイクルをどのように設定するかによって克服できると考えられている.
キャッシュを簡単に使用します.
キャッシュの利点、使い方などはすでに身につけていると思います.
プロジェクトに適用します.
私たちはユーザーにもっと快適なサービスを提供できると思います.
ありがとうございます🚀
すべてのコードはGithubで管理されています.
必要な時に確認すればいいです😊
まず、キャッシュを使用してデータを取得する理由が分からない人について簡単に説明します.
デフォルトでcacheを使用してデータをインポートする理由は
データベースの負荷を削減しながら、データ・クエリーの時間を短縮
快適なサービスを提供することにあります.
しかし、不適切な使用をすると、望ましくないデータが発生し、信頼性が低下する可能性がある.
使用する場合は、慎重に使用してください.
Gradle依存性
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'net.sf.ehcache:ehcache:2.10.3'
ehcache.xml設定
classpathのehcacheとしてdefaultを使用します.xmlを探しに行くと言って、私は明確に指摘して、次回見る時も混同せずにパスを設定しました.
ymlファイルはmain/resourcesパッケージにあります
# application.yml
spring:
cache:
ehcache:
config: classpath:ehcache.xml
<!-- ehcache.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<diskStore path="java.io.tmpdir" />
<cache name="findMemberCache"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="1000"
eternal="false"
diskSpoolBufferSizeMB="20"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LFU"
transactionalMode="off">
<persistence strategy="localTempSwap" />
</cache>
</ehcache>
Code
コードを記述する前に、
@EnableCaching
言語の説明をアプリケーション(main)セクションに追加してください.次に、宣言は、キャッシュに関連する宣言(
@Cacheable
、@CacheEvict
)をこの項目で使用する.MemberController.java
@GetMapping("/nocache/{username}")
public Member getNocacheMember(@PathVariable String username) {
long start = System.currentTimeMillis(); // 수행시간 측정
Member member = memberService.findMemberNoCache(username);
long end = System.currentTimeMillis();
log.info(username+ "의 NoCache 수행시간 : "+ (end - start)); // 수행시간 logging
return member;
}
@GetMapping("/cache/{username}")
public Member getCacheMember(@PathVariable String username) {
long start = System.currentTimeMillis(); // 수행시간 측정
Member member = memberService.findMemberCache(username);
long end = System.currentTimeMillis();
log.info(username+ "의 Cache 수행시간 : "+ (end - start)); // 수행시간 logging
return member;
}
@GetMapping("/cache/refresh/{username}")
public String refresh(@PathVariable String username){
memberService.refresh(username); // 캐시제거
log.info(username+ "의 Cache Clear!");
return username + " cache clear!";
}
コントローラは実行時間を測定します.キャッシュのテスト、キャッシュなし、キャッシュの削除などの方法があります.
MemberService.java
public Member findMemberNoCache(String username) {
slowQuery(2000);
return memberRepository.findMemberByUsername(username);
}
@Cacheable(value="findMemberCache", key = "#username") // 해당 캐시 사용
public Member findMemberCache(String username) {
slowQuery(2000);
return memberRepository.findMemberByUsername(username);
}
@CacheEvict(value = "findMemberCache", key="#username") //해당 캐시 삭제
public String refresh(String username) {
return username + "님의 Cache Clear !";
}
// 빅쿼리를 돌린다는 가정
private void slowQuery(long seconds) {
try {
Thread.sleep(seconds);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
}
@Cacheable(value="findMemberCache")は、ehcache.xml
で指定されたfindMemberCacheキャッシュが使用されることを示します.これは、キャッシュ・クエリー・データを使用することを意味します.
ここでkeyは、メソッドパラメータnameを使用することを意味する.
すなわち,nameによって個別にキャッシュされる.
キャッシュされていない場合は、キャッシュされているかどうかを確認し、データを取得してキャッシュします.
キャッシュの場合、キャッシュされたデータが返されます.
@CacheEveit(value="findMemberCache",key="#username")は、キャッシュ内容がクリアされることを示します.
キャッシュデータを更新する必要がある場合、
@CacheEvict
が宣言を実行する方法は、キャッシュデータを削除し、キャッシュするために新しいデータを受信する.キーに基づいてキャッシュを選択して削除できます.
キャッシュクエリを使用する論理とキャッシュされていない論理との間のパフォーマンスを比較するためのslowQueryというメソッドが追加されました.
大量のデータが存在すると仮定し、クエリーごとに2秒以上かかります.
slowQueryはthreadを2秒間休眠させるため、
findMemberNoCache
およびfindMemberCache
の方法は少なくとも2秒以上を必要とする.この場合、実行速度の違いを比較してみましょう.
NoCache
http://localhost:8080/nocache/qoxogus
上の住所に3回お願いしました.各クエリーには2秒以上の実行時間がかかります(上にクエリーが切断されていますが)、クエリーが終了するたびにクエリーが終了するかどうかを判断できます.
Cache
http://localhost:8080/cache/qoxogus
上の住所に6回リクエストしました.最初のクエリにはキャッシュされていないデータがあり、実行時間は2秒を超え、クエリは停止しました.
1回目のクエリから2秒もかからず、クエリも必要なく、データをインポートするかどうかを確認できます.
Refresh
データベースに格納されているデータが更新されると、キャッシュされたデータも再格納されます.
この場合、既存のキャッシュデータを削除します.
を選択してもアクセスできます.
http://localhost:8080/member/cache/qoxogus
http://localhost:8080/member/cache/refresh/qoxogus
http://localhost:8080/member/cache/qoxogus
上記の手順でリクエストを出しました.キャッシュが完了してから再キャッシュするのに2秒以上かかり、クエリが終了したことを確認できます.
その後、キャッシュされたデータの再取得も確認できます.
Cache-key
同じキャッシュがキーに基づいて別々にキャッシュされているかどうかを確認します.
http://localhost:8080/member/cache/qoxogus
http://localhost:8080/member/cache/test
上記の手順でリクエストを出しました.quxogusのリクエストとtestのリクエストがそれぞれキャッシュされ、管理されていると判断できます.
使用上の注意
文章が終わったら
キャッシュを簡単に使用します.
キャッシュの利点、使い方などはすでに身につけていると思います.
プロジェクトに適用します.
私たちはユーザーにもっと快適なサービスを提供できると思います.
ありがとうございます🚀
Reference
この問題について(SpringBootでのEhcacheの使用), 我々は、より多くの情報をここで見つけました https://velog.io/@qoxogus/SpringBoot에서-Ehcache-사용해보기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol