Sobes.tech
Middle

Խոսեք կեշի մակարդակների մասին։

sobes.tech AI

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

Կեշավորումը Java- ում կարող է իրականացվել տարբեր մակարդակներում, որոնցից յուրաքանչյուրը ունի իր առանձնահատկությունները և կոմպրոմիսները կատարողականության և տվյալների արդիականության միջև:

Հիմնական կեշավորման մակարդակները:

  1. Ճշմարտության կեշ (CPU Cache):

    • L1, L2, L3 կեշեր, որոնք տեղադրված են անմիջապես պրոցեսորի շապիկի վրա:
    • Ամենահետաքրքիր, բայց ամենափոքր կեշ:
    • Կառավարվում է սարքավորումների կողմից, չի հասանելի ուղղակի ծրագրային վերահսկողության համար Java API-ով:
  2. Օպերացիոն համակարգի կեշ:

    • Կեշավորում է ֆայլերի, ցանցային socket-ների և այլ ռեսուրսների հասանելիությունը:
    • Կառավարում է օՀ. Ս.։ Java-ով ծրագրերը շփվում են դրա հետ միջնորդավորված՝ համակարգային կանչերի միջոցով:
  3. Java վիրտուալ մեքենայի (JVM) կեշ:

    • JIT-կոմպիլատորը կեշավորում է կոմպիլացված կոդը:
    • JVM-ի ներքին օպտիմիզացիաներ (օրինակ՝ String Pool-ի կեշավորում):
    • Կառավարվում է JVM-ի նշանների միջոցով, հիմնականում ավտոմատացված:
  4. In-Memory Application Cache:

    • Կենդանի հիշողության մեջ է Java-ծրագիրը:
    • Ամենատարածված տվյալների կեշ մակարդակ, որը կառավարում է ծրագրավորողը:
    • Օգտագործվում է հաճախ օգտագործվող օբյեկտների կամ հարցումների արդյունքների պահպանման համար:
    • Օրինակներ գրադարաններից՝ Guava Cache, Ehcache, Caffeine:
    • Կարող է լինել տեղական (միայն մեկ JVM շրջանակներում) կամ տարածված (միջեւ մի քանի JVM):
    // Guava-ի հետ In-Memory կեշի օրինակ
    import com.google.common.cache.CacheBuilder;
    import com.google.common.cache.CacheLoader;
    import com.google.common.cache.LoadingCache;
    
    import java.util.concurrent.TimeUnit;
    
    public class DataCache {
    
        private final LoadingCache<String, String> dataCache;
    
        public DataCache() {
            dataCache = CacheBuilder.newBuilder()
                .maximumSize(100) // Մաքսիմալ տարրերի քանակը
                .expireAfterWrite(10, TimeUnit.MINUTES) // Ժամկետը՝ գրառման պահպանումից հետո
                .build(new CacheLoader<String, String>() {
                    @Override
                    public String load(String key) throws Exception {
                        // Տվյալների բեռնում, եթե չկա կեշում
                        System.out.println("Loading data for key: " + key);
                        return fetchDataFromDatabase(key); // Դատարկ տվյալների ստացում
                    }
                });
        }
    
        public String getData(String key) {
            try {
                return dataCache.get(key);
            } catch (Exception e) {
                e.printStackTrace();
                return null; // Հետամուտների մշակումը
            }
        }
    
        private String fetchDataFromDatabase(String key) {
            // Ժամկետային պատճենում և տվյալների ստացում արտաքին աղբյուրից
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return "Data for " + key;
        }
    
        public static void main(String[] args) {
            DataCache cache = new DataCache();
    
            System.out.println(cache.getData("key1")); // Բեռնում աղբյուրից, գրանցում կեշում
            System.out.println(cache.getData("key1")); // Կարդում է կեշից
        }
    }
    
  5. Տվյալների բազայի կեշ:

    • Դատավարությունների և տվյալների կեշավորում տվյալների բազայի կողմից:
    • Реализуется СУБД:
  6. Տարածված կեշ:

    • Կեշ, որը տարածված է մի քանի սերվերների կամ հանգույցների միջև:
    • Օգտագործվում է կլաստային ծրագրերում տվյալների համատեղման և ընդլայնման համար:
    • Օրինակներ՝ Redis, Memcached, Apache Ignite:
    • Պահանջում է տվյալների համահունչության հարցերի լուծում:
  7. Վեբ սերվերի/API Gateway կեշ:

    • Կեշեր՝ վեբ սերվերի մակարդակում (օրինակ՝ Nginx, Apache) կամ API Gateway:
    • HTTP/API հարցումների պատասխանների կեշավորում:
  8. Բրաուզերի կեշ:

    • Ստատիկ ռեսուրսների (HTML, CSS, JS, պատկերներ) կեշը օգտագործողի բրաուզերում:
    • Կառավարվում է HTTP գլխիկներով (Cache-Control, Expires):

Ընտրությունը կախված է տվյալների տիպից, արդիականության պահանջներից, տվյալների ծավալից, ընդլայնելիությունից և իրականացման բարդությունից:

Ամեն դեպքում՝ հաճախ կիրառվում է մի քանի մակարդակների համակցում։