Sobes.tech
Middle

Кэш картасы кандай иштээрин билесиңби?

sobes.tech AI

AIден жооп

Memory Cache (Эс тутуму) Android — бул түзмөктүн оперативдик эсинде маалыматтарды сактоо механизми, тез жетүү үчүн. Ал ассоциациялык кэштин принциптерине негизделген.

Кандай иштейт:

  1. Маалымат сураныч: Маалыматтарды сураганда, алар кэшке сакталышы мүмкүн (мисалы, интернеттен сүрөт же кыйын операциянын жыйынтыгы), колдонмо биринчи кэшти текшерет.
  2. Кэште издөө: Эгер маалыматтар кэште табылса (демек, суроо ачкычы кэштеги ачкычка дал келсе), алар дароо кайтарылат, жай операциялардан же эсептөөлөрдөн качуу үчүн. Бул "cache hit" деп аталат.
  3. Кэшке түшпөө (Cache Miss): Эгер маалыматтар табылбаса ("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);
}