Sobes.tech
Middle

Räägi mulle vahemälu tasemetest.

sobes.tech AI

Vastus AI-lt

Java-s võib vahemälu rakendada erinevatel tasemetel, igaühel on omad omadused ja kompromissid jõudluse ning andmete ajakohasuse vahel.

Peamised vahemälu tasemed:

  1. Protsessori vahemälu (CPU Cache):

    • L1, L2, L3 vahemälud, mis paiknevad otse protsessori kiibil.
    • Kõige kiirem, kuid väikseim vahemälu.
    • Juhtimisega riistvara poolt, ei ole otseselt kättesaadav Java API kaudu.
  2. Operatsioonisüsteemi vahemälu:

    • Vahemälustab juurdepääsu failidele, võrgusokettidele ja teistele ressurssidele.
    • Juhtimisega OS. Java rakendus suhtleb sellega kaudselt süsteemikutsumite kaudu.
  3. Java virtuaalse masina (JVM) vahemälu:

    • JIT-kompilaator vahemälustab kompileeritud koodi.
    • JVM sisemised optimeerimised (näiteks String Pool vahemälu).
    • Osaliselt kontrollitav JVM märkide kaudu, peamiselt automatiseeritud.
  4. In-Memory Application Cache:

    • Asub Java protsessi operatiivmälus.
    • Kõige levinum andmete vahemälu tase, mida juhib arendaja.
    • Kasutatakse sageli kasutatavate objektide või päringute tulemuste salvestamiseks.
    • Näited teekidest: Guava Cache, Ehcache, Caffeine.
    • Võib olla lokaalne (ühe JVM raames) või hajutatud (mõne JVM vahel).
    // Näide Guava kasutamisega In-Memory vahemälust
    import com.google.common.cache.CacheBuilder;
    import com.google.common.cache.CacheLoader;
    import com.google.common.cache.LoadingCache;
    
    import java.util.concurrent.TimeUnit;
    
    public class DataCache {
    
        private final LoadingCache<String, String> dataCache;
    
        public DataCache() {
            dataCache = CacheBuilder.newBuilder()
                .maximumSize(100) // Maksimaalne elementide arv
                .expireAfterWrite(10, TimeUnit.MINUTES) // Eluiga pärast kirjet
                .build(new CacheLoader<String, String>() {
                    @Override
                    public String load(String key) throws Exception {
                        // Andmete laadimise loogika, kui neid pole vahemälus
                        System.out.println("Loading data for key: " + key);
                        return fetchDataFromDatabase(key); // Andmete imitatsioon
                    }
                });
        }
    
        public String getData(String key) {
            try {
                return dataCache.get(key);
            } catch (Exception e) {
                e.printStackTrace();
                return null; // Vead töötlemine
            }
        }
    
        private String fetchDataFromDatabase(String key) {
            // Viivituse ja andmete saamise imitatsioon välisest allikast
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return "Data for " + key;
        }
    
        public static void main(String[] args) {
            DataCache cache = new DataCache();
    
            System.out.println(cache.getData("key1")); // Laadimine allikast, kirje vahemällu
            System.out.println(cache.getData("key1")); // Loeb vahemälust
        }
    }
    
  5. Andmebaasi vahemälu:

    • Päringute ja andmete vahemälu andmebaasi poolel.
    • Realiseerib andmebaasihaldussüsteem (DBMS).
  6. Hajutatud vahemälu:

    • Vahemälu, mis on hajutatud mitme serveri või sõlme vahel.
    • Kasutatakse klastrirakendustes andmete jagamiseks ja skaleerimiseks.
    • Näited: Redis, Memcached, Apache Ignite.
    • Vajab andmete konsistentsuse küsimuste lahendamist.
  7. Veebiserveri/API Gateway vahemälu:

    • Vahemälu veebiserveri tasemel (näiteks Nginx, Apache) või API Gateway tasemel.
    • HTTP/API päringute vastuste vahemälu.
  8. Brauseri vahemälu:

    • Statiliste ressursside (HTML, CSS, JS, pildid) vahemälu kasutaja brauseris.
    • Juhtimisega HTTP päistega (Cache-Control, Expires).

Valik vahemälu tasemest sõltub andmete tüübist, aktuaalsusnõuetest, andmete mahust, skaleeritavusest ja rakendamise keerukusest.

Tihti kasutatakse mitme taseme kombinatsiooni.