SpringBootでのEhcacheの使用


もし私のコメントに問題があったらコメントで教えてくださいありがとうございます!🙇‍♂️
すべてのコードは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のリクエストがそれぞれキャッシュされ、管理されていると判断できます.

使用上の注意

  • 頻繁に変更されるデータほど、キャッシュを慎重に選択する必要があります.
  • データの整合性が損なわれることを懸念している.
  • データ・クエリの複数の場所にキャッシュを適用するには、メモリのメモリ量も考慮する必要があります.
  • この部分は、キャッシュのライフサイクルをどのように設定するかによって克服できると考えられている.
  • 文章が終わったら


    キャッシュを簡単に使用します.
    キャッシュの利点、使い方などはすでに身につけていると思います.
    プロジェクトに適用します.
    私たちはユーザーにもっと快適なサービスを提供できると思います.
    ありがとうございます🚀