本文源碼:GitHub·點這裏 || GitEE·點這裏java
EhCache是一個純Java的進程內緩存框架,具備快速、上手簡單等特色,是Hibernate中默認的緩存提供方。git
Hibernate三級緩存機制簡介:github
一級緩存:基於Session級別分配一塊緩存空間,緩存訪問的對象信息。Session關閉後會自動清除緩存。redis
二級緩存:是SessionFactory對象緩存,能夠被建立出的多個 Session 對象共享,二級緩存默認是關閉的,若是要使用須要手動開啓,而且依賴EhCache組件。spring
三級緩存:查詢緩存,配置開啓該緩存的狀況下,重複使用一個sql查詢某個範圍內的數據,會進行緩存。sql
Ehcache:直接在Jvm虛擬機中緩存,速度快,效率高,不適合處理大規模緩存數據,在分佈式環境下,緩存數據共享操做複雜;數據庫
Redis:做爲獨立的緩存中間件,在分佈式緩存系統中很是好用,緩存數據共享,有效支撐大量數據緩存,支持哨兵模式,或者集羣模式的高可用成熟方案;跨域
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency>
基礎配置緩存
spring: cache: ehcache: config: classpath:ehcache.xml
啓動類註解springboot
@EnableCaching @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args) ; } }
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <!-- 操做系統緩存的臨時目錄,內存滿後寫入該目錄 --> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> <persistence strategy="localTempSwap"/> </defaultCache> <cache name="userEntity" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> <persistence strategy="localTempSwap"/> </cache> </ehcache>
配置參數說明
maxElementsOnDisk:磁盤緩存中最多能夠存放的元素數量;
eternal:緩存中對象是否永久有效;
timeToIdleSeconds:當eternal=false時使用,緩存數據有效期(單位:秒),時間段內沒有訪問該元素,將被清除;
timeToLiveSeconds:緩存數據的存活時間;
maxElementsInMemory:內存中最多能夠存放的元素數量,overflowToDisk=true,則會將Cache中多出的元素放入磁盤文件中,若overflowToDisk=false,則根據memoryStoreEvictionPolicy策略替換Cache中原有的元素;
diskExpiryThreadIntervalSeconds:磁盤緩存的清理線程運行間隔;
memoryStoreEvictionPolicy:緩存釋放策略,LRU會優先清理最少使用的緩存;
localTempSwap:持久化策略,當堆內存或者非堆內存裏面的元素已經滿了的時候,將其中的元素臨時的存放在磁盤上,重啓後就會消失;
@Service public class CacheService { private static final Logger LOGGER = LoggerFactory.getLogger(CacheService.class); @Resource private UserMapper userMapper ; @Cacheable(value="userEntity") // 在緩存有效期內,首次查詢才訪問數據庫 public UserEntity getById (Integer id){ // 經過日誌,標識方法是否執行 LOGGER.info("getById..."+id); return userMapper.selectById(id) ; } @CacheEvict(value="userEntity",key = "#id") //該ID數據更新,清空該ID緩存 public void updateUser(Integer id) { UserEntity user = new UserEntity() ; user.setId(id); user.setUserName("myCache"); userMapper.updateById(user); } }
@Cacheable:註解標記在一個方法上,也能夠標記在一個類上,標記在一個方法上表示該方法支持緩存,該方法被調用後將其返回值緩存起來,下次一樣的請求參數執行該方法時能夠直接從緩存中獲取結果,而不須要再次執行該方法。
@CacheEvict:註解標記在須要清除緩存元素的方法或類上的,當標記在一個類上時表示其中全部的方法的執行都會觸發緩存的清除操做,而且能夠按照指定屬性清除。
GitHub·地址 https://github.com/cicadasmile/middle-ware-parent GitEE·地址 https://gitee.com/cicadasmile/middle-ware-parent
推薦閱讀:SpringBoot進階系列