Middle
Դու գիտե՞ս, թե ինչպես է աշխատում կեշ քարտը։
sobes.tech AI
Պատասխան AI-ից
Memory Cache (Հիշողության կեշ) Android-ում — դա տվյալների պահեստավորման մեխանիզմ է սարքի օպերատիվ հիշողության մեջ արագ մուտք գործելու համար: Այն հիմնված է ասոցացվող կեշի սկզբունքների վրա:
Ինչպես է աշխատում:
- Տվյալների հարցում: Երբ դիմումը խնդրում է տվյալներ, որոնք կարող են լինել կեշավորված (օրինակ՝ ցանցից նկարը կամ բարդ գործողության արդյունքը), այն նախ ստուգում է կեշ- քարտը:
- Որոնում կեշում: Եթե տվյալները գտնվել են կեշում (այսինքն՝ հարցման բանալին համընկնում է կեշի բանալու հետ), դրանք անմիջապես վերադարձվում են՝ խուսափելով դանդաղ մուտք-արտահոս կամ հաշվարկներից: Սա կոչվում է "cache hit":
- Կեշի բացթողում (Cache Miss): Եթե տվյալները չեն գտնվել կեշում, դիմումը ստանում է դրանք սկզբնաղբյուրից (ցանց, տվյալների բազա և այլն):
- Տվյալների տեղադրում կեշում: Հետագայում տվյալները տեղադրվում են կեշ- քարտում՝ նույն բանալու համար:
- Ելք (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);
}