Spring Boot 菜鳥教程 17 Cache-快取
阿新 • • 發佈:2019-01-09
GitHub
快取
- 快取就是資料交換的緩衝區(稱作Cache),當某一硬體要讀取資料時,會首先從快取中查詢需要的資料,如果找到了則直接執行,找不到的話則從記憶體中找。由於快取的執行速度比記憶體快得多,故快取的作用就是幫助硬體更快地執行。
- 因為快取往往使用的是RAM(斷電即掉的非永久儲存),所以在用完後還是會把檔案送到硬碟等儲存器裡永久儲存。電腦裡最大的快取就是記憶體條了,最快的是CPU上鑲的L1和L2快取,顯示卡的視訊記憶體是給顯示卡運算晶片用的快取,硬碟上也有16M或者32M的快取。
Spring3.1開始引入了對Cache的支援
- 其使用方法和原理都類似於Spring對事務管理的支援,就是aop的方式。
Spring Cache是作用在方法上的,其核心思想是:當我們在呼叫一個快取方法時會把該方法引數和返回結果作為一個鍵值對存放在快取中,等到下次利用同樣的引數來呼叫該方法時將不再執行該方法,而是直接從快取中獲取結果進行返回。
@CacheConfig
- * 在類上面統一定義快取的名字,方法上面就不用標註了*
- * 當標記在一個類上時則表示該類所有的方法都是支援快取的*
@CachePut
- * 根據方法的請求引數對其結果進行快取*
- * 和 @Cacheable 不同的是,它每次都會觸發真實方法的呼叫*
- * 一般可以標註在save方法上面*
@CacheEvict
- * 針對方法配置,能夠根據一定的條件對快取進行清空*
- * 一般標註在delete,update方法上面*
Spring Cache現有缺陷
- 如有一個快取是存放 List,現在你執行了一個 update(user)的方法,你一定不希望清除整個快取而想替換掉update的元素
- 這個在現有快取實現上面沒有很好的方案,只有每次dml操作的時候都清除快取,配置如下@CacheEvict(allEntries=true)
業務邏輯實現類UserServiceImpl
package com.jege.spring.boot.data.jpa.service.impl;
import org.springframework.beans .factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.jege.spring.boot.data.jpa.entity.User;
import com.jege.spring.boot.data.jpa.repository.UserRepository;
import com.jege.spring.boot.data.jpa.service.UserService;
/**
* @author JE哥
* @email [email protected]
* @description:業務層介面實現
*/
@Service
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
@CacheConfig(cacheNames = "user")
public class UserServiceImpl implements UserService {
@Autowired
UserRepository userRepository;
@Override
@Cacheable()
public Page<User> findAll(Pageable pageable) {
return userRepository.findAll(pageable);
}
@Override
@Cacheable()
public Page<User> findAll(Specification<User> specification, Pageable pageable) {
return userRepository.findAll(specification, pageable);
}
@Override
@Transactional
@CacheEvict(allEntries=true)
public void save(User user) {
userRepository.save(user);
}
@Override
@Transactional
@CacheEvict(allEntries=true)
public void delete(Long id) {
userRepository.delete(id);
}
}
其他關聯專案
原始碼地址
如果覺得我的文章或者程式碼對您有幫助,可以請我喝杯咖啡。
您的支援將鼓勵我繼續創作!謝謝!