Sobes.tech
Middle

Vieš, ako funguje cache karta?

sobes.tech AI

Odpoveď od AI

Memory Cache (Pamäťová vyrovnávacia pamäť) v Android je mechanizmus na ukladanie údajov do operačnej pamäte zariadenia pre rýchly prístup. Je založený na princípoch asociatívnej vyrovnávacej pamäte.

Ako funguje:

  1. Žiadosť o údaje: Pri požiadavke na údaje, ktoré môžu byť uložené v cache (napríklad obrázok zo siete alebo výsledok zložitých operácií), aplikácia najskôr skontroluje cache.
  2. Hľadanie v cache: Ak sú údaje nájdené v cache (t. j. kľúč požiadavky zodpovedá kľúču v cache), sú ihneď vrátené, čím sa vyhýba pomalým operáciám vstupu/výstupu alebo výpočtom. Toto sa nazýva "cache hit".
  3. Chyba v cache (Cache Miss): Ak údaje nie sú nájdené v cache ("cache miss"), aplikácia ich získa zo zdroja (sieť, databáza atď.).
  4. Uloženie do cache: Po získaní sa údaje uloží do cache na budúce požiadavky s rovnakým kľúčom.
  5. Vypudenie (Cache Eviction): Cache má obmedzenú veľkosť. Keď sa naplní, staré alebo menej používané prvky sa vypúšťajú, aby sa uvoľnilo miesto pre nové. Bežné algoritmy vypúšťania zahŕňajú LRU (Least Recently Used - najmenej nedávno používané) a LFU (Least Frequently Used - najmenej často používané).

Príklad implementácie v Android s použitím LruCache:

// Vytvorenie LruCache s maximálnou veľkosťou
private LruCache<String, Bitmap> memoryCache;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Získanie maximálnej dostupnej veľkosti pamäte pre aplikáciu (v KB)
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

    // Používame 1/8 dostupnej pamäte pre cache
    final int cacheSize = maxMemory / 8;

    memoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // Metóda na výpočet veľkosti každého prvku cache v jednotkách,
            // zodpovedajúcich veľkosti cache (tu - KB)
            return bitmap.getByteCount() / 1024;
        }
    };
}

// Pridanie prvku do cache
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        memoryCache.put(key, bitmap);
    }
}

// Získanie prvku z cache
public Bitmap getBitmapFromMemCache(String key) {
    return memoryCache.get(key);
}