Sobes.tech
Middle

Vai tu zini, kā darbojas keškarte?

sobes.tech AI

Atbilde no AI

Memory Cache (Atmiņas kešatmiņa) Android — tas ir mehānisms datu glabāšanai ierīces operatīvajā atmiņā, lai nodrošinātu ātru piekļuvi. Tā balstās uz asociatīvās kešatmiņas principiem.

Kā tas darbojas:

  1. Datu pieprasījums: Kad lietotne pieprasa datus, kas var tikt kešoti (piemēram, attēls no tīkla vai sarežģītas operācijas rezultāts), tā vispirms pārbauda kešatmiņu.
  2. Meklēšana kešatmiņā: Ja dati ir atrasti kešatmiņā (t. i., pieprasījuma atslēga atbilst kešatmiņas atslēgai), tie tiek nekavējoties atgriezti, izvairoties no lēnām ievades-izvades operācijām vai aprēķiniem. To sauc par "cache hit".
  3. Kešatmiņas trūkums (Cache Miss): Ja dati nav atrasti kešatmiņā ("cache miss"), lietotne tos iegūst no oriģinālā avota (tīkls, datu bāze utt.).
  4. Datu ievietošana kešatmiņā: Pēc iegūšanas dati tiek ievietoti kešatmiņā nākotnes pieprasījumiem ar to pašu atslēgu.
  5. Izslēgšana (Cache Eviction): Kešatmiņai ir ierobežota izmērs. Kad tā ir pilna, vecie vai mazāk lietotie elementi tiek izslēgti, lai atbrīvotu vietu jauniem. Populāri izslēgšanas algoritmi ir — LRU (Mazāk lietots nesen) un LFU (Mazāk bieži lietots).

Piemērs Android ar LruCache:

// Maksimālā izmēra `LruCache` izveide
private LruCache<String, Bitmap> memoryCache;

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

    // Maksimālā pieejamā atmiņas izmēra iegūšana (KB)
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

    // Izmantojam 1/8 no pieejamās atmiņas kešam
    final int cacheSize = maxMemory / 8;

    memoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // Metode, kas aprēķina katra elementa izmēru kešā,
            // atbilstoši keša izmēram (šeit — KB)
            return bitmap.getByteCount() / 1024;
        }
    };
}

// Elementa pievienošana kešam
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        memoryCache.put(key, bitmap);
    }
}

// Elementa iegūšana no kešatmiņas
public Bitmap getBitmapFromMemCache(String key) {
    return memoryCache.get(key);
}