Spring Boot入門-進級編(5)-データキャッシュ(@Cacheable)

4103 ワード

詳細
キャッシュはデータベースアクセスの圧力を緩和することができ、Spring自身はキャッシュのストレージ実装を提供せず、JCache、EhCache、Hazelcast、Redis、Guavaなどのサードパーティを借りる必要がある.Spring Bootでは、適切なキャッシュマネージャ(CacheManager)の構成を自動化できます.デフォルトでは、ConcurrentMapCacheManager(java.util.concurrent.ConcurrentHashMap)が使用されます.
(1)spring-boot-starter-cache依存の追加

    org.springframework.boot
    spring-boot-starter-cache

(2)キャッシュ機能のオン
@Configuration
@EnableCaching
public class CacheConfig {

}

(3)キャッシュデータ
キャッシュの操作は,@Cacheable,@CachePut,@CacheEveictが主である.
@Cacheable
Spring@Cacheable注記のメソッドを実行する前に、キャッシュにデータがあるかどうかを確認し、データがある場合はキャッシュデータを直接返します.データがない場合は、メソッドを実行し、メソッドの戻り値をキャッシュに入れます.
パラメータ:valueキャッシュ名、keyキャッシュキー値、conditionがキャッシュ条件を満たす、unlessがキャッシュ条件を拒否する
@Cacheable(value = "user", key = "#id")
public User findById(final Long id) {
    System.out.println("cache miss, invoke find by id, id:" + id);
    for (User user : users) {
        if (user.getId().equals(id)) {
            return user;
        }
    }
    return null;
}

@CachePut
@Cacheableと似ていますが、メソッドの戻り値はキャッシュに格納され、主にデータの新規作成やメソッドの変更に使用されます.
@CachePut(value = "user", key = "#user.id")
public User save(User user) {
    users.add(user);
    return user;
}

@CacheEvict
メソッドが正常に実行されると、対応するデータがキャッシュから削除されます.
パラメータ:valueキャッシュ名、keyキャッシュキー値、conditionがキャッシュ条件を満たす、unlessがキャッシュ条件を拒否する、allEntriesがすべてのデータを除去するかどうか(trueに設定するとすべてのキャッシュが除去されます)
@CacheEvict(value = "user", key = "#user.id") //     key   
public User delete(User user) {
    users.remove(user);
    return user;
}
@CacheEvict(value = "user", allEntries = true) //       
public void deleteAll() {
    users.clear();
}

(4)集積EhCache

    net.sf.ehcache
    ehcache

SpringBootは、特別な設定を必要とせずに自動的に設定できます.
src/main/resources/ehcache.xml

    
    

src\main\resources/application.properties
参照
spring.cache.ehcache.config=classpath:ehcache.xml
パーソナライズされたパラメータをカスタマイズする場合は、Java Config形式で構成します.
@Configuration
@EnableCaching
public class CacheConfig {

	@Bean
	public CacheManager cacheManager() {
		return new EhCacheCacheManager(ehCacheCacheManager().getObject());
	}

	@Bean
	public EhCacheManagerFactoryBean ehCacheCacheManager() {
		EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
		cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
		cmfb.setShared(true);
		return cmfb;
	}

}

(5)コンビネーションCacheManager
複数のCacheManagerからポーリングして対応するCacheを取得します.
@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager compositeCacheManager(RedisTemplate redisTemplate) {
        CompositeCacheManager cacheManager = new CompositeCacheManager(new ConcurrentMapCacheManager(), new SimpleCacheManager());
        cacheManager.setFallbackToNoOpCache(false);
        cacheManager.afterPropertiesSet();
        return cacheManager;
    }

}

***キャッシュ無効化springを設定する.cache.type=none
***キャッシュされたオブジェクトはSerializableを実装する必要があります
***GuavaCacheManagerのほかにSpringトランザクションがサポートされています.つまり、ロールバック時にCacheのデータも削除されます.