Muistinsisäinen välimuistitus ja Caffeinen hienosäätö
Määrittäkää Caffeinen poistamis-, vanhenemis- ja kokokäytännöt tehokkaille paikallisille välimuisteille.
Muistinsisäinen välimuistitus ja Caffeinen hienosäätö on ilmainen Spring Boot 4:n kattava opas-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Spring Boot 4:n kattava opas-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Spring Boot 4:n kattava opas-kurssilla on yhteensä 4 oppituntia.
Miksi Caffeine sopii paikallisiin välimuisteihin
Caffeine on suorituskykyinen ja lähes optimaalinen Java-välimuistikirjasto sekä Spring Bootin oletusarvoinen muistinsisäinen välimuisti, kun se löytyy luokkapolulta.
- Se käyttää Window TinyLFU -poistamiskäytäntöä, joka saavuttaa todellisissa käyttötilanteissa paremman osumaprosentin kuin tavallinen LRU.
- Se tukee kokoon, aikaan ja viittauksiin perustuvaa poistoa.
- Se on täysin rinnakkainen, eikä lukupolku käytä lukkoja, joten se sopii hyvin suuren suoritusmäärän palveluille.
Tässä oppitunnissa säädätte Caffenien poisto-, vanhentumis- ja kokokäytäntöjä, jotta paikallinen välimuisti pysyy nopeana kuluttamatta kekoa loppuun.
Caffenien lisääminen Spring Boot 4 -sovellukseen
Spring Boot konfiguroi Caffenien automaattisesti, kun sekä spring-boot-starter-cache- että caffeine-riippuvuus ovat mukana.
Ottakaa välimuistitus käyttöön lisäämällä @EnableCaching konfiguraatioluokkaan. @Cacheable-annotaatiolla merkityt menetelmät käyttävät Caffeine-pohjaista CacheManager-toteutusta.
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
public class CacheConfig {
// CaffeineCacheManager is auto-configured
// when com.github.ben-manes.caffeine:caffeine is on the classpath
}Enimmäiskokoon perustuva poisto
Paikallisen välimuistin yleisin käytäntö on rajattu koko. Rajoittakaa merkintöjen määrää maximumSize-asetuksella; rajan ylittyessä Caffeine poistaa vähiten arvokkaat merkinnät (Window TinyLFU).
- Valitkaa koko, joka mahtuu mukavasti kekoon arvo-olioiden viemä tila huomioiden.
- Poisto ei tapahdu välittömästi rajalla, vaan nopeasti mutta asynkronisesti.
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
@Bean
public CaffeineCacheManager cacheManager() {
CaffeineCacheManager manager = new CaffeineCacheManager("products");
manager.setCaffeine(Caffeine.newBuilder()
.maximumSize(10_000)
.recordStats());
return manager;
}Painoon perustuva poisto
Kun merkintöjen koot vaihtelevat huomattavasti, rajatkaa välimuisti merkintöjen määrän sijaan niiden painon perusteella. Määrittäkää maximumWeight sekä Weigher, joka palauttaa kunkin merkinnän kustannuksen.
maximumSize- jamaximumWeight-asetuksia ei voi käyttää samassa välimuistissa.- Painot lasketaan lisäyksen yhteydessä kerran, eikä niitä päivitetä myöhemmin.
import com.github.benmanes.caffeine.cache.Caffeine;
Caffeine.newBuilder()
.maximumWeight(50_000_000) // ~50MB budget
.weigher((String key, byte[] value) -> value.length)
.build();expireAfterWrite vs expireAfterAccess
Aikaperusteisella vanhentumisella on kaksi muotoa:
- expireAfterWrite: merkintä vanhentuu tietyn ajan kuluttua sen luomisesta tai viimeisimmästä korvaamisesta. Sopii parhaiten tiedoille, joilla on tunnettu tuoreusikkuna, kuten viiden minuutin ajan voimassa olevalle hinnalle.
- expireAfterAccess: merkintä vanhentuu tietyn ajan kuluttua sen viimeisimmästä luku- tai kirjoitusoperaatiosta. Sopii parhaiten aktiivisten tietojen säilyttämiseen ja käyttämättömien merkintöjen poistamiseen.
Voitte yhdistää molemmat asetukset; merkintä vanhentuu, kun jompikumpi ehdoista täyttyy ensin.
import com.github.benmanes.caffeine.cache.Caffeine;
import java.time.Duration;
Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(Duration.ofMinutes(5))
.expireAfterAccess(Duration.ofMinutes(2))
.build();Määrittäminen application.properties-tiedoston kautta
Kun käytössä on yksi yhteinen määritys, Spring Bootin avulla Java-määrityksen voi jättää pois ja käyttää spring.cache.caffeine.spec-ominaisuutta. Se hyväksyy pilkuilla erotellun Caffeine-määritysmerkkijonon.
Tämä on kätevää, mutta sama määritys koskee jokaista välimuistin nimeä; välimuistikohtainen hienosäätö edellyttää edelleen ohjelmallisesti määritettyä CaffeineCacheManager-komponenttia tai mukautettua CacheLoader-komponenttia.
spring.cache.type=caffeine
spring.cache.cache-names=products,prices
spring.cache.caffeine.spec=maximumSize=10000,expireAfterWrite=5m,recordStatsrefreshAfterWrite vanhentuneen tiedon uudelleenvalidointiin
refreshAfterWrite eroaa vanhenemisesta: merkinnän poistamisen sijaan se lataa sen uudelleen asynkronisesti määritetyn ajan kuluttua ja tarjoaa samalla edelleen vanhan arvon. Näin vältetään viivepiikki ensimmäisessä pyynnössä merkinnän vanhentumisen jälkeen.
- Se edellyttää
LoadingCache-välimuistia (välimuistia, joka on luotuCacheLoader-komponentilla). - Vain yksi säie käynnistää päivityksen; muut jatkavat olemassa olevan arvon lukemista.
- Yhdistä se pidempään
expireAfterWrite-aikaan, joka toimii ehdottomana ylärajana.
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import java.time.Duration;
LoadingCache<String, String> cache = Caffeine.newBuilder()
.refreshAfterWrite(Duration.ofMinutes(1))
.expireAfterWrite(Duration.ofMinutes(10))
.build(key -> loadFromDatabase(key));Itsenäinen Caffeine-esimerkki
Tässä on täydellinen, kehyksistä riippumaton ohjelma, joka havainnollistaa maximumSize-rajoitukseen perustuvaa poistamista. Lisää merkintöjä enemmän kuin raja sallii ja huomaa, ettei välimuistin koko siivouksen jälkeen koskaan ylitä rajaa.
Tällaisen mikrotason suorituskykytestin voi suorittaa, kun haluat varmistaa säätövalinnan ennen sen liittämistä Springiin.
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
public class CaffeineDemo {
public static void main(String[] args) {
Cache<Integer, String> cache = Caffeine.newBuilder()
.maximumSize(3)
.build();
for (int i = 0; i < 10; i++) {
cache.put(i, "value-" + i);
}
cache.cleanUp(); // force pending eviction work
System.out.println("Estimated size: " + cache.estimatedSize());
System.out.println("Get key 9: " + cache.getIfPresent(9));
}
}Välimuistikohtainen hienosäätö mukautetuilla määrityksillä
Tuotantopalveluissa eri välimuisteille tarvitaan usein erilaiset käytännöt: pieni, paljon käytetty hakutaulukko tarvitsee eri asetukset kuin suuri, usein käytettävä tietojoukko. Peri CaffeineCacheManager-luokka tai määritä se niin, että kukin nimi saa oman muodostimensa.
Yksi selkeä tapa on rekisteröidä yksittäiset natiivivälimuistit nimien perusteella manageriin.
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import java.time.Duration;
@Bean
public CaffeineCacheManager cacheManager() {
CaffeineCacheManager manager = new CaffeineCacheManager();
manager.registerCustomCache("prices", Caffeine.newBuilder()
.maximumSize(1_000)
.expireAfterWrite(Duration.ofSeconds(30))
.build());
manager.registerCustomCache("catalog", Caffeine.newBuilder()
.maximumSize(100_000)
.expireAfterAccess(Duration.ofHours(1))
.build());
return manager;
}Osumissuhteen mittaaminen recordStats-toiminnolla
Sellaista ei voi säätää, mitä ei mitata. Ota recordStats() käyttöön, jotta saat näkyviin CacheStats-tilastot: osumien määrän, ohitusten määrän, poistojen määrän ja latauksen keskimääräisen kustannuksen.
- Matala osumissuhde viittaa siihen, että välimuisti on liian pieni tai avainten kardinaliteetti on liian suuri.
- Suuri poistojen määrä yhdessä suuren ohitussuhteen kanssa tarkoittaa, että
maximumSizeei riitä työjoukolle. - Spring Bootin Micrometer-integraatio julkaisee nämä mittareina, kun tilastointi on käytössä.
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.stats.CacheStats;
public class StatsDemo {
public static void main(String[] args) {
Cache<String, Integer> cache = Caffeine.newBuilder()
.maximumSize(2)
.recordStats()
.build();
cache.put("a", 1);
cache.getIfPresent("a"); // hit
cache.getIfPresent("b"); // miss
CacheStats stats = cache.stats();
System.out.printf("hits=%d misses=%d rate=%.2f%n",
stats.hitCount(), stats.missCount(), stats.hitRate());
}
}Yleisten hienosäätöongelmien välttäminen
Suuren läpimenon tilanteissa kannattaa varoa muutamaa sudenkuoppaa:
- Rajoittamattomat välimuistit: älä koskaan luo välimuistia ilman koko- tai vanhenemisrajaa, sillä se voi aiheuttaa
OutOfMemoryError-virheen. - initialCapacity: aseta se lähelle odotettua vakiintunutta kokoa, jotta lukupainotteisella suorituspolulla vältetään toistuva koon muuttaminen.
- Pehmeät ja heikot viittaukset:
softValues()sitoo poistamisen roskienkeräimen aiheuttamaan muistinpaineeseen, mikä on ennalta arvaamatonta. Viiveherkissä välimuisteissa kannattaa käyttää eksplisiittisiä koko- ja aikarajoja. - refreshAfterWrite ilman lataajaa: sillä ei ole hiljaisesti mitään vaikutusta manuaaliseen välimuistiin.
Pikatarkistus: vanhenemiskäytännön valitseminen
Välimuistiin tallennetaan tuotteiden hinnat, joiden alkuperäinen järjestelmä takaa olevan voimassa täsmälleen 5 minuuttia julkaisemisen jälkeen. Lukeminen on toistuvaa, mutta hintaa ei saa koskaan tarjota, jos se on yli 5 minuuttia vanha. Mikä Caffeine-käytäntö sopii parhaiten?
Yhteenveto
Hienosäädit Caffeninen suuren läpimenon paikallista välimuistia varten Spring Boot 4:ssä:
- Koko:
maximumSizeyhdenmukaisille merkinnöille,maximumWeightjaWeighervaihtelevan kustannuksen merkinnöille. - Aika:
expireAfterWritetuoreussopimuksiin jaexpireAfterAccessusein käytetyn datan säilyttämiseen; yhdistä ne, kun tarvitset molemmat ylärajat. - Päivitys: käytä
refreshAfterWrite-asetustaLoadingCache-välimuistissa vanhentuneen tiedon uudelleenvalidointiin ilman viivepiikkejä. - Määritys: käytä
spring.cache.caffeine.spec-ominaisuutta yhtä yhteistä määritystä varten tairegisterCustomCache-toimintoa välimuistikohtaiseen hienosäätöön. - Mittaaminen: ota
recordStats()aina käyttöön ja seuraa osumissuhdetta sekä poistojen määrää jatkohienosäädön perustana.
Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 21
- Oppitunnit
- 84
Usein kysytyt kysymykset
Onko oppitunti ”Muistinsisäinen välimuistitus ja Caffeinen hienosäätö” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Spring Boot 4:n kattava opas-oppimispolun 3 oppituntia, myös oppitunnin “Muistinsisäinen välimuistitus ja Caffeinen hienosäätö”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Spring Boot 4:n kattava opas-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Muistinsisäinen välimuistitus ja Caffeinen hienosäätö”?
Määrittäkää Caffeinen poistamis-, vanhenemis- ja kokokäytännöt tehokkaille paikallisille välimuisteille. Harjoittelet Spring Boot 4:n kattava opas-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Spring Boot 4:n kattava opas-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Spring Boot 4:n kattava opas-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Muistinsisäinen välimuistitus ja Caffeinen hienosäätö”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Spring Boot 4:n kattava opas-oppitunnilla?
Kyllä. Jokainen Spring Boot 4:n kattava opas-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Spring Cache -abstraktion perusteet
- Muistinsisäinen välimuistitus ja Caffeinen hienosäätö
- Hajautettu välimuistitus Redisillä ja TTL-arvoilla
- Välimuistin stampede-ilmiö, mitätöinti ja johdonmukaisuus