Sobes.tech
Middle

Ξέρεις πώς λειτουργεί η κάρτα cache;

sobes.tech AI

Απάντηση από AI

Η μνήμη cache (Memory Cache) στο Android είναι ένας μηχανισμός αποθήκευσης δεδομένων στη μνήμη RAM της συσκευής για γρήγορη πρόσβαση. Βασίζεται στις αρχές της συσχετιστικής cache.

Πώς λειτουργεί:

  1. Αίτημα δεδομένων: Όταν ζητούνται δεδομένα που μπορούν να αποθηκευτούν στην cache (π.χ. μια εικόνα από το δίκτυο ή το αποτέλεσμα μιας πολύπλοκης λειτουργίας), η εφαρμογή ελέγχει πρώτα την cache.
  2. Αναζήτηση στην cache: Αν τα δεδομένα βρεθούν στην cache (δηλαδή, το κλειδί του αιτήματος ταιριάζει με το κλειδί στην cache), επιστρέφονται άμεσα, αποφεύγοντας αργές λειτουργίες εισόδου/εξόδου ή υπολογισμούς. Αυτό ονομάζεται "cache hit".
  3. Cache miss: Αν τα δεδομένα δεν βρεθούν στην cache ("cache miss"), η εφαρμογή τα λαμβάνει από την αρχική πηγή (δίκτυο, βάση δεδομένων κ.λπ.).
  4. Τοποθέτηση στην cache: Μετά την απόκτησή τους, τοποθετούνται στην cache για μελλοντικά αιτήματα με το ίδιο κλειδί.
  5. Εκκαθάριση (Cache Eviction): Η cache έχει περιορισμένο μέγεθος. Όταν γεμίζει, τα παλιά ή λιγότερο χρησιμοποιούμενα στοιχεία απομακρύνονται για να ελευθερωθεί χώρος για νέα. Δημοφιλείς αλγόριθμοι εκκαθάρισης είναι LRU (Least Recently Used) και LFU (Least Frequently Used).

Παράδειγμα υλοποίησης σε Android με LruCache:

// Δημιουργία LruCache με μέγιστο μέγεθος
private LruCache<String, Bitmap> memoryCache;

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

    // Απόκτηση μέγιστου διαθέσιμου μεγέθους μνήμης για την εφαρμογή (σε KB)
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

    // Χρησιμοποιούμε 1/8 της διαθέσιμης μνήμης για την cache
    final int cacheSize = maxMemory / 8;

    memoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // Μέθοδος για τον υπολογισμό του μεγέθους κάθε στοιχείου της cache σε μονάδες,
            // εδώ - KB
            return bitmap.getByteCount() / 1024;
        }
    };
}

// Προσθήκη στοιχείου στην cache
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        memoryCache.put(key, bitmap);
    }
}

// Λήψη στοιχείου από την cache
public Bitmap getBitmapFromMemCache(String key) {
    return memoryCache.get(key);
}