tags: redis,ehcahe,jcache,memcache
緩存機(jī)制的引入可以提高系統(tǒng)的訪問(wèn)效率仙粱。
它的主要實(shí)現(xiàn)思想是:在程序和數(shù)據(jù)源之間引入一個(gè)中間層即Cache踊东,訪問(wèn)cache的時(shí)間成本肯定遠(yuǎn)低于數(shù)據(jù)源荒适。
按照Cache所在可以簡(jiǎn)單分為進(jìn)程外緩存和本地緩存。
對(duì)于單機(jī)推薦使用 ehcahe
對(duì)于分布式 推薦使用 redis 和 MemCached丁寄;
- SpringBoot支持很多種緩存方式:redis、guava、ehcahe源梭、jcache等等。
- Redis && memcache 緩存中間件:屬于獨(dú)立的運(yùn)行程序 可以單機(jī)部署稍味,也可以分布式部署废麻;
- ehcache: 是程序的一個(gè)功能模塊。 緩存的訪問(wèn)速度快模庐,但不太適合分布式部署烛愧。
- 讀寫速度,不考慮并發(fā)問(wèn)題,本地緩存是最快的
緩存預(yù)熱
在緩存初始化時(shí)怜姿,緩存中是沒(méi)有任何緩存數(shù)據(jù)的慎冤,需先將數(shù)據(jù)緩存后,緩存服務(wù)才算完全啟動(dòng)沧卢。預(yù)熱方式:
- miss后粪薛,實(shí)時(shí)查詢,然后更新緩存數(shù)據(jù)搏恤;
- 缺點(diǎn)1:多個(gè)tomcat實(shí)例同時(shí)查詢數(shù)據(jù)并跟新緩存违寿,在一段時(shí)間內(nèi)緩存近似于失效;
- 缺點(diǎn)2:在高并發(fā)場(chǎng)景下熟空,無(wú)法限制對(duì)數(shù)據(jù)庫(kù)訪問(wèn)速度藤巢;
- 通過(guò)task或接口預(yù)先加載服務(wù),然后開啟緩存服務(wù)息罗;
- 優(yōu)勢(shì)1:在初始化服務(wù)時(shí)掂咒,限制加載數(shù)據(jù)的速度;
- 優(yōu)勢(shì)2:批量查詢數(shù)據(jù)庫(kù)迈喉,減少與數(shù)據(jù)庫(kù)之間的網(wǎng)絡(luò)交互绍刮;
緩存穿透的問(wèn)題
問(wèn)題:
- 緩存穿透是指查詢一個(gè)根本不存在的數(shù)據(jù),緩存層和存儲(chǔ)層都不會(huì)命中挨摸,
- 緩存穿透將導(dǎo)致不存在的數(shù)據(jù)每次請(qǐng)求都要到存儲(chǔ)層去查詢孩革,失去了緩存保護(hù)后端存儲(chǔ)的意義。
原因:代碼問(wèn)題得运, 爬蟲膝蜈,攻擊,大量空命中
場(chǎng)景:查詢某個(gè)文章熔掺,給了一個(gè)錯(cuò)誤的文章id饱搏。一直查詢不到。
方法:
緩存空對(duì)象
- 空值做緩存置逻,即緩存層中存了更多的鍵推沸,這就需要更多的內(nèi)存空間 ,可以對(duì)其設(shè)置一個(gè)較短的過(guò)期時(shí)間券坞,讓其自動(dòng)清除鬓催。
- 優(yōu)點(diǎn)是實(shí)時(shí)性高,代碼維護(hù)簡(jiǎn)單报慕。
可以緩存到本地內(nèi)存中深浮,空對(duì)想用一個(gè)靜態(tài)變量压怠。這樣不會(huì)造成 造成占用內(nèi)存眠冈。