1. 程式人生 > >輕鬆搞定資料快取

輕鬆搞定資料快取

快取可以緩解資料庫訪問的壓力,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