SpringBootシリーズ(7)---SpringBoot-Cache(EhCache)

13866 ワード

SpringBootはデータキャッシュの機能を提供しており、多くの人がcacheを使ったことがあると信じています.データベースのIOボトルネックは皆さんも損をしたはずなので、redisの導入、hibernateの2次キャッシュの導入など、多くのキャッシュポリシーを導入します.
SpringBootはannotationの面でcacheを実現してくれました.もちろんSpringのAOPのおかげです.すべてのキャッシュ構成はannotationレベルで構成されているだけで、宣言トランザクションのようにコードに侵入していません.
Springでは、CacheManagerとCacheインタフェースが異なるキャッシュ技術を統合することを定義します.ここでCacheManagerはSpringが提供する各種キャッシュ技術の抽象インタフェースである.Cacheインタフェースにはキャッシュの様々な操作が含まれています.もちろん、Cacheインタフェースを直接操作することはありません.
Springは異なるキャッシュ技術に対して異なるcacheManagerを実現する必要があり、Springは以下のcacheManger実現を定義している.
CacheManger
説明
SimpleCacheManager
簡単なCollectionを使用してキャッシュを格納し、主にテストに使用します.
ConcurrentMapCacheManager
キャッシュ・テクノロジーとしてConcurrentMapを使用する(デフォルト)
NoOpCacheManager
テスト用
EhCacheCacheManager
キャッシュ技術としてEhCacheを使用しており、以前はhibernateでよく使われていました
GuavaCacheManager
Google guavaのGuavaCacheをキャッシュ技術として使用
HazelcastCacheManager
キャッシュ・テクノロジーとしてHazelcastを使用
JCacheCacheManager
Apache Commons JCSなどのキャッシュ技術としてJCache標準の実装を用いる
RedisCacheManager
Redisをキャッシュ・テクノロジーとして使用
もちろん、通常のSpringBootでは、EhCache、Collection、Guava、ConcurrentMapなどのキャッシュが自動的に構成されており、デフォルトではSimpleCacheConfiguration、すなわちConcurrentMapCacheManagerが使用されます.SpringBootのアプリケーションpropertiesプロファイル、springを使用します.Cache接頭辞のプロパティを構成します.
spring.cache.type=#       
spring.cache.cache-names=             
spring.cache.ehcache.config=ehcache       
spring.cache.infinispan.config=infinispan       
spring.cache.jcache.config=jcache      
spring.cache.jcache.provider=   jcache    ,    jcache    

SpringBoot環境では、関連するキャッシュ・テクノロジーの依存をインポートし、構成クラスで@EnableCachingオープン・キャッシュ・テクノロジーを構成する必要があります.
ここではデフォルトのConcurrentMapCacheではなくEhCacheを使用します
だから私はresourcesディレクトリの下でehcacheを作成しました.xmlのプロファイルをアプリケーションで作成します.properties設定typeはehcache(intellijに明確なヒントがあります):
ehcache.xml:
 
  

    
    path="java.io.tmpdir"/>

    
    
    name="weibo" maxElementsInMemory="10000" />
 
    
                maxElementsInMemory="10000"
            eternal="false"
            overflowToDisk="true"
            timeToIdleSeconds="10"
            timeToLiveSeconds="120"
            diskPersistent="false"
            memoryStoreEvictionPolicy="LRU"
            diskExpiryThreadIntervalSeconds="120"/>

    
    
    
    
    
    
    

    

    

    


application.properties:
spring.cache.type=ehcache
spring.cache.ehcache.config=ehcache.xml
コンフィギュレーションクラスで@EnableCaching
@SpringBootApplication
@EnableCaching
public class DemoApplication extends WebMvcConfigurerAdapter {

次に、4つのannotationの構成について説明します.
@Cacheableメソッドが実行される前にSpringにキャッシュデータがあるかどうか、直接返される場合.データがない場合は、メソッドを呼び出し、メソッドの戻り値をキャッシュに格納します.
@CachePutはいずれにしても,メソッドの範湖値をキャッシュに入れる.
@CacheEveictは、1つまたは複数のデータをキャッシュから削除します.
@Cachingは、@Caching注釈によって複数の注釈セットを1つの方法で組み合わせることができる
デモンストレーションJPAの方法を使用してキャッシュテストを行います.
@Transactional
@CachePut(value = "weibo",key="#weibo.weiboId")
public Weibo saveWeibo(Weibo weibo){
    this.weiboRepository.save(weibo);
    return weibo;
}

@Cacheable(value = "weibo")
public Weibo getWeiboById(long id){
    return this.weiboRepository.getByWeiboId(id);
}


@Transactional
@CacheEvict(value = "weibo",key = "#weibo.weiboId")
public void remove(Weibo weibo){
    this.weiboRepository.delete(weibo);
}

もちろんweiboというキャッシュを単独で構成したいならehcacheを通じてもいいです.xmlは個別に構成されますが、maxElementsInMemoryプロパティ構成が必要であることを注意してください.そうしないとSpringBootアプリケーションを起動できません.
name="weibo" maxElementsInMemory="10000" overflowToDisk="false" timeToIdleSeconds="60"  timeToLiveSeconds="120" />

Controllerによるテストでは、キャッシュが有効になります.
@RestController
@RequestMapping("/cache")
public class CacheTestController {

    @Autowired
    private WeiboService weiboService;
    @Autowired
    private UserRepository userRepository;

    @RequestMapping("/getWeibo/{id}")
    public Weibo getWeibo(@PathVariable("id") long id){
        return weiboService.getWeiboById(id);
    }

    @RequestMapping("/addWeibo")
    public Weibo addWeibo(String username,String weiboText){
        User user = userRepository.getByUsernameIs(username);
        Weibo weibo = new Weibo(user,weiboText,new Date(System.currentTimeMillis()));
        return this.weiboService.saveWeibo(weibo);
    }

    @RequestMapping("/delete/{id}")
    public Weibo delete(@PathVariable("id") long id){
        Weibo weibo = this.weiboService.getWeiboById(id);
        this.weiboService.remove(weibo);
        return weibo;
    }
}