注解在方法上,表明方法的返回結(jié)果會(huì)緩存。相同的參數(shù)對(duì)應(yīng)相同的返回緩存。以后相同的參數(shù)進(jìn)行調(diào)用時(shí),并不會(huì)執(zhí)行方法,而是使用返回緩存中的值。
1.1 cacheNames value@Cacheable提供兩個(gè)參數(shù)來(lái)指定緩存名
cacheNames value
調(diào)用方法時(shí),檢查緩存,如果緩存中有數(shù)據(jù),不會(huì)執(zhí)行方法。
@Cacheable("menu")
public Menu findById(String id){}
1.2 關(guān)聯(lián)多個(gè)緩存名可以關(guān)聯(lián)多個(gè)緩存名,執(zhí)行方法時(shí),關(guān)聯(lián)的緩存都會(huì)檢查,只要其中一個(gè)緩存命中,這個(gè)緩存的值就會(huì)返回。
@Cacheable({"menu","menu2"})
public Menu findById(String id){}
1.3 key 和 keygenerator一個(gè)緩存名對(duì)應(yīng)一個(gè)注解方法,但是一個(gè)方法傳入不同的參數(shù),結(jié)果不通,區(qū)分用到key。
key可以顯示指定,也可以通過(guò)keygenerator生成
不指定key則會(huì)采用keyGenerator進(jìn)行自動(dòng)生成
官方推薦顯式的指定key,可以通過(guò)springEL表達(dá)式來(lái)解決不同入?yún)⒌膯?wèn)題
@Cacheable(value={"menu"},key="#id")
public Menu findById(String id){}
@Cacheable(value={"menu"},key="'id-'+#menu.id")
public Menu findById(Menu menu){}
key和keyGenerator是互斥的,同時(shí)指定兩個(gè)會(huì)導(dǎo)致異常
1.4 CacheManager CacheResolverCacheManager 緩存管理器用來(lái)管理一級(jí)緩存。緩存管理器與緩存組件類型相關(guān)聯(lián)的。
srping緩存抽象的目的是為使用不同的緩存組件類型提供提供統(tǒng)一的訪問(wèn)接口,以向開(kāi)發(fā)者屏蔽各種緩存組件的差異。
CacheResolver 緩存解析器是用來(lái)管理緩存管理器的,CacheResolver保持CacheManager的引用,并用他來(lái)檢索緩存。類似于keyGenerator和key
一般情況下,系統(tǒng)只會(huì)使用一種緩存,不需要顯式的指定CacheManager和CacheResolver。同時(shí)配置多中緩存,需要指定,使用的是@cacheable中的參數(shù)
1.5 sync是否同步,多線程環(huán)境下相同參數(shù)的訪問(wèn)是否進(jìn)行對(duì)入口加鎖,即只有一個(gè)線程計(jì)算操作的結(jié)果值,避免了n-1次數(shù)據(jù)庫(kù)訪問(wèn)
sync=true 可以有效避免緩存擊穿的問(wèn)題
調(diào)用前判斷,緩存的條件。接受springEL表達(dá)式,為true進(jìn)行緩存,否則直接調(diào)用
1.7 unlessspringEL表達(dá)式,為ture不緩存,為false緩存
2.@CachePut 放置緩存@CachePut和@Cacheable屬性相同
@CachePut是執(zhí)行方法體緩存結(jié)果
@Cacheable是查找緩存,有就返回,沒(méi)有執(zhí)行方法體,緩存結(jié)果
依賴
org.springframework.boot spring-boot-starter-data-redis
配置
spring.redis.host=127.0.0.1
spring.redis.password=123456
spring.redis.port=6379
啟動(dòng)類注解
@SpringBootApplication
@EnableCaching
public class RedisTestApplication {public static void main(String[] args) {SpringApplication.run(RedisTestApplication.class, args);
}
}
請(qǐng)求入口
@RestController
public class CacheTestController {@Autowired
private CacheTest cacheTest;
@RequestMapping("putCache")
public String testCachePut(){cacheTest.testCachePut();
return "放置緩存成功";
}
@RequestMapping("testCacheable")
public String testCacheable(){cacheTest.testCacheable();
return "獲取緩存";
}
@RequestMapping("deleteCache")
public String testCacheEvict(){cacheTest.testCacheEvict();
return "刪除緩存";
}
}
緩存
@Component
public class CacheTest {@Autowired
CacheManager cacheManager;
@CachePut(value = "test1",key = "'testCache1'")
public Integer testCachePut(){System.out.println("放置緩存");
return 1;
}
@Cacheable(value = "test1",key = "'testCache1'")
public Integer testCacheable(){System.out.println("緩存測(cè)試");
return 1;
}
@CacheEvict(value = "test1",key = "'testCache1'")
public void testCacheEvict(){System.out.println("刪除緩存");
return ;
}
public void getCache(){// System.out.println(redisCacheManager.getCache("test1"));
System.out.println(cacheManager.getCache("test1"));
}
}
在進(jìn)行請(qǐng)求后會(huì)發(fā)現(xiàn)redis中多了對(duì)應(yīng)key的數(shù)據(jù)
在刪除緩存后進(jìn)行獲取緩存測(cè)試,會(huì)發(fā)現(xiàn),在沒(méi)有緩存的時(shí)候會(huì)執(zhí)行一次方法,之后多次調(diào)用就不會(huì)調(diào)用方法,而是獲取緩存。
刪除緩存后刷新redis,已經(jīng)找不到對(duì)應(yīng)key的數(shù)據(jù)了
5.默認(rèn)緩存和redis緩存不引入redis依賴 使用的是spring的緩存
CacheManager在沒(méi)有redis依賴時(shí),getCache走的ConcurrentMapCacheManager類中的
拿到的cache對(duì)象為org.springframework.cache.concurrent.ConcurrentMapCache@8347d73
有redis依賴getCache走的是AbstractCacheManager類中的
拿到的cache對(duì)象為org.springframework.data.redis.cache.RedisCache@11e1d8da
默認(rèn)緩存的生命周期和項(xiàng)目周期是一致的。
redis緩存的生命周期是和redis中的數(shù)據(jù)的生命周期是一致的。
項(xiàng)目發(fā)版(重啟)默認(rèn)緩存會(huì)丟失,但是redis緩存,只要redis數(shù)據(jù)沒(méi)清除,就不需要重新獲取緩存。
為什么要用redis做緩存?
1.redis可以用幾十G的內(nèi)存來(lái)做緩存
2.redis緩存可以持久化
3.redis是分布式緩存,默認(rèn)緩存的生命周期隨著jvm的銷毀而結(jié)束,屬于本地緩存,不具有一致性。
4.redis可以處理百萬(wàn)并發(fā),專業(yè)的緩存服務(wù)
5.redis緩存有過(guò)期機(jī)制
6.redis有豐富的API
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧