Sobes.tech
Middle

Դու գիտե՞ս, թե ինչպես է աշխատում կեշ քարտը։

sobes.tech AI

Պատասխան AI-ից

Memory Cache (Հիշողության կեշ) Android-ում — դա տվյալների պահեստավորման մեխանիզմ է սարքի օպերատիվ հիշողության մեջ արագ մուտք գործելու համար: Այն հիմնված է ասոցացվող կեշի սկզբունքների վրա:

Ինչպես է աշխատում:

  1. Տվյալների հարցում: Երբ դիմումը խնդրում է տվյալներ, որոնք կարող են լինել կեշավորված (օրինակ՝ ցանցից նկարը կամ բարդ գործողության արդյունքը), այն նախ ստուգում է կեշ- քարտը:
  2. Որոնում կեշում: Եթե տվյալները գտնվել են կեշում (այսինքն՝ հարցման բանալին համընկնում է կեշի բանալու հետ), դրանք անմիջապես վերադարձվում են՝ խուսափելով դանդաղ մուտք-արտահոս կամ հաշվարկներից: Սա կոչվում է "cache hit":
  3. Կեշի բացթողում (Cache Miss): Եթե տվյալները չեն գտնվել կեշում, դիմումը ստանում է դրանք սկզբնաղբյուրից (ցանց, տվյալների բազա և այլն):
  4. Տվյալների տեղադրում կեշում: Հետագայում տվյալները տեղադրվում են կեշ- քարտում՝ նույն բանալու համար:
  5. Ելք (Cache Eviction): Կեշը սահմանափակ չափի է: Երբ այն լցվում է, հին կամ քիչ օգտագործվող տարրերը դուրս են մղվում՝ տեղ ազատելու համար նորերի համար: Հաճախ օգտագործվող ալգորիթմներն են՝ LRU (Ամենակարճ ժամանակ օգտագործված) և LFU (Ամենակն հաճախ օգտագործված):

Օրինակ՝ 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 հասանելի հիշողությունը կեշի համար
    final int cacheSize = maxMemory / 8;

    memoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // Մեթոդ՝ հաշվելու յուրաքանչյուր տարրի չափը կեշում՝ միավորներով,
            // համապատասխանելով կեշի չափին (այստեղ՝ KB)
            return bitmap.getByteCount() / 1024;
        }
    };
}

// Տարր ավելացնել կեշ
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        memoryCache.put(key, bitmap);
    }
}

// Տարր ստանալ կեշից
public Bitmap getBitmapFromMemCache(String key) {
    return memoryCache.get(key);
}