輕鬆搞定資料快取
阿新 • • 發佈:2018-12-26
快取可以緩解資料庫訪問的壓力,Spring自身不提供快取的儲存實現,需要藉助第三方,比如JCache、EhCache、Hazelcast、Redis、Guava等。Spring Boot可以自動化配置合適的快取管理器(CacheManager),預設採用的是
ConcurrentMapCacheManager(java.util.concurrent.ConcurrentHashMap)
。
新增 spring-boot-starter-cache 依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
開啟快取功能
@Configuration
@EnableCaching
public class CacheConfig {
}
快取資料
對於快取的操作,主要有:@Cacheable、@CachePut、@CacheEvict。
@Cacheable
Spring 在執行 @Cacheable 標註的方法前先檢視快取中是否有資料,如果有資料,則直接返回快取資料;若沒有資料,執行該方法並將方法返回值放進快取。 引數: value快取名、 key快取鍵值、 condition滿足快取條件、unless否決快取條件
@CachePut
和 @Cacheable 類似,無論快取有沒有資料,執行該方法並將方法返回值放進快取, 主要用於資料新增和修改方法。
@CacheEvict
方法執行成功後會從快取中移除相應資料。 引數: value快取名、 key快取鍵值、 condition滿足快取條件、 unless否決快取條件、 allEntries是否移除所有資料(設定為true時會移除所有快取)
@Component @Slf4j public class CacheUtil { @Autowired User user; @Cacheable(value = "user", key = "#user.name") public User getUser(User user){ log.info("get user"); return user; } @CachePut(value = "user", key = "#user.name") public User saveUser(User user){ log.info("save user"); return user; } @CacheEvict(value = "user", key = "#name") // 移除指定key的資料 public void deleteUser(String name){ log.info("delete user"); } @CacheEvict(value = "user", allEntries = true) // 移除所有資料 public void deleteAll() { log.info("delete All"); } }
整合EhCache
新增依賴
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
ehcache.xml
放到src/main/resources
,配置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;
}
}
快取的物件必須實現Serializable