प्रौद्योगिकी साझेदारी

SpringBoot Read Through मोड् कार्यान्वितं करोति

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

आमुख

Read Through मोड् सामान्यतया एकं संग्रहणरणनीतिं निर्दिशति यस्मिन् यदा कश्चन अनुप्रयोगः दत्तांशं पठितुं प्रयतते तदा प्रथमं संग्रहणप्रणालीं परीक्षिता भवति यत् दत्तांशः पूर्वमेव संग्रहणे उपस्थितः अस्ति वा इति यदि दत्तांशः संग्रहे विद्यते (अर्थात् cache hit), तर्हि दत्तांशः प्रत्यक्षतया cache तः पठ्यते, अनुप्रयोगे च प्रत्यागच्छति । यदि दत्तांशः सञ्चये नास्ति (अर्थात्, सञ्चयस्य चूकः), तर्हि दत्तांशः अन्तर्निहितदत्तांशसञ्चयात् (यथा दत्तांशकोशः) पठ्यते, ततः संग्रहे लोड् भवति, अन्ते च अनुप्रयोगे प्रत्यागच्छति

अस्य प्रतिरूपस्य मुख्यलाभाः सन्ति- १.

  1. कार्यप्रदर्शने सुधारं कुर्वन्तु: अन्तर्निहितभण्डारणस्य प्रत्यक्षप्रवेशस्य संख्यां न्यूनीकृत्य आँकडापुनर्प्राप्तेः कार्यप्रदर्शने महत्त्वपूर्णतया सुधारः कर्तुं शक्यते ।
  2. विलम्बं न्यूनीकरोतु: संग्रहणं सामान्यतया स्मृतौ स्थितं भवति तथा च डिस्क-भण्डारणात् बहु शीघ्रं अभिगन्तुं शक्यते, अतः आँकडा-पुनर्प्राप्तेः विलम्बः न्यूनीकरोति ।
  3. दत्तांशकोशभारं न्यूनीकरोतु: बहुधा अभिगतदत्तांशं संग्रहे संग्रह्य दत्तांशकोशे प्रश्नदबावः न्यूनीकर्तुं शक्यते, येन सम्पूर्णस्य प्रणाल्याः थ्रूपुट् सुधरति

Read Through मोड् सामान्यतया Lazy Loading तथा Eager Loading इत्यादिभिः रणनीतिभिः सह विपरीतः भवति:

  • आलस्य लोडिंग: आवश्यकतायां एव आँकडा लोड् भवति, यत् अनावश्यकं दत्तांशभारं न्यूनीकरोति परन्तु प्रथमप्रवेशे विलम्बं वर्धयितुं शक्नोति ।
  • उत्सुक लोडिंग: पूर्वलोड् आँकडा, यत् प्रथम-प्रवेश-विलम्बं न्यूनीकर्तुं शक्नोति परन्तु भवतः अनुप्रयोगस्य स्मृति-उपयोगं प्रारम्भ-समयं च वर्धयितुं शक्नोति ।

Read Through mode इत्यस्य कार्यान्वयनकाले भवान् निम्नलिखितविषये विचारं कर्तुम् इच्छति ।

  • कैश अमान्यीकरण रणनीति: संग्रहात् कदा दत्तांशं निष्कासयितव्यम् इति निर्धारयन्तु, यथा समय-आधारितः (TTL) अथवा स्थान-आधारितः (यदा संग्रहणः निश्चित-आकारं प्राप्नोति) ।
  • समवर्ती नियन्त्रण: यत्र बहुविधाः अनुप्रयोगदृष्टान्ताः एकस्मिन् समये संग्रहणं परिवर्तयन्ति परिवर्तयन्ति च इति स्थितिं नियन्त्रयन्तु ।
  • दत्तांशस्य स्थिरता: सुनिश्चितं कुर्वन्तु यत् संग्रहे विद्यमानाः दत्तांशाः अन्तर्निहितभण्डारणस्थाने दत्तांशैः सह सङ्गताः सन्ति, विशेषतः यदा दत्तांशः अद्यतनः भवति ।

पूरयतु

Spring Boot इत्यस्मिन् Read Through pattern इत्यस्य कार्यान्वयनम् सामान्यतया Spring Cache abstraction इत्यस्य माध्यमेन कर्तुं शक्यते । Spring Cache विभिन्नेषु cache कार्यान्वयनेषु एकीकृतं API प्रदाति तथा च बहुविधं cache समाधानं समर्थयति, यथा EhCache, Hazelcast, Infinispan, Redis इत्यादयः ।

  1. निर्भरतां योजयतु: प्रथमं, भवद्भिः Spring Boot इत्यस्य cache dependencies तथा च चयनितं cache implementation library (यथा Redis) योजयितव्यम् ।

    1. <!-- Spring Boot Starter Cache -->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-cache</artifactId>
    5. </dependency>
    6. <!-- 以Redis为例,添加Redis的Spring Boot Starter -->
    7. <dependency>
    8. <groupId>org.springframework.boot</groupId>
    9. <artifactId>spring-boot-starter-data-redis</artifactId>
    10. </dependency>
  2. कैश एनोटेशन्स् सक्षमं कुर्वन्तु:Spring Boot विन्यासवर्गे योजयन्तु@EnableCachingcache एनोटेशन समर्थनं सक्षमं कर्तुं annotation ।

  3. कैश प्रबन्धकं विन्यस्यताम्: एकं वा अधिकं वा विन्यस्यताम्CacheManager, Spring Boot स्वयमेव सरलं विन्यस्यतिCacheManager, परन्तु आवश्यकतानुसारं अधिकजटिलसञ्चयरणनीतयः विन्यस्तुं शक्नुवन्ति ।

    1. import org.springframework.context.annotation.Bean;
    2. import org.springframework.context.annotation.Configuration;
    3. import org.springframework.data.redis.cache.RedisCacheConfiguration;
    4. import org.springframework.data.redis.cache.RedisCacheManager;
    5. import org.springframework.data.redis.connection.RedisConnectionFactory;
    6. @Configuration
    7. public class RedisCacheConfig {
    8. @Bean
    9. public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
    10. RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
    11. .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()))
    12. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(GenericJackson2JsonRedisSerializer.json())))
    13. Map<String, RedisCacheConfiguration> customCacheConfigs = new HashMap<>();
    14. customCacheConfigs.put("mySpecialCache",
    15. config.entryTtl(Duration.ofMinutes(15))); // 为特定缓存设置不同的过期时间
    16. .disableCachingNullValues();
    17. return RedisCacheManager.builder(connectionFactory)
    18. .cacheDefaults(config)
    19. // 在这里可以自定义添加缓存配置
    20. .withInitialCacheConfigurations(customCacheConfigs)
    21. .build();
    22. }
    23. }
  4. कैश एनोटेशन्स् इत्यस्य उपयोगं कुर्वन्तु: येषु विधिषु संग्रहणस्य आवश्यकता भवति तेषु उपयुज्यते@Cacheable Read Through मोड् कार्यान्वितुं एनोटेशन्स् । यदि सञ्चये दत्तांशः नास्ति तर्हि विधिः आह्वयते, परिणामः च संग्रहीतः भविष्यति ।
    1. import org.springframework.cache.annotation.Cacheable;
    2. import org.springframework.stereotype.Service;
    3. @Service
    4. public class MyService {
    5. @Cacheable(value = "myCache", key = "#id")
    6. public MyData getDataById(String id) {
    7. // 从数据库加载数据
    8. return myDataRepository.findById(id);
    9. }
    10. }
  5. कैश कील:अस्ति@Cacheableएनोटेशनमध्ये cache कीलं निर्दिष्टं भवति, यत् प्रायः मेथड् पैरामीटर् इत्यस्य मूल्यस्य आधारेण भवति ।

  6. सञ्चयनाम: कैश-नाम निर्दिशन्तु, यस्य उपयोगः भिन्न-भिन्न-सञ्चय-क्षेत्राणां भेदाय भविष्यति ।

  7. कैश पैरामीटर्स् विन्यस्यताम्: भवान् आवश्यकतानुसारं cache timeout, conditions, यावत् कण्डिशन् इत्यादीन् विन्यस्तुं शक्नोति

    1. मूल्यं वा cacheNames इति :सञ्चयनाम निर्दिशतु। भवान् एकं वा अधिकं वा cache नाम निर्दिष्टुं शक्नोति यत् cache संग्रहणार्थं उपयुज्यते ।

      @Cacheable(value = "myCacheName", key = "#id")
    2. कुंजी : cache key values ​​कृते generation strategy परिभाषयन्तु। SpEL अभिव्यक्तिः (Spring Expression Language) प्रायः मेथड् पैरामीटर्स् कैश कीलरूपेण निर्दिष्टुं उपयुज्यते ।

      @Cacheable(cacheNames = "myCache", key = "#id")
    3. दशा: संग्रहणार्थं शर्ताः परिभाषयन्तु, तथा च यदा शर्ताः पूर्यन्ते तदा एव संग्रहयन्तु ।

      @Cacheable(cacheNames = "myCache", key = "#id", condition = "#id.length() > 3")
    4. न यावत्‌: न कैशिंग् इत्यस्य शर्ताः परिभाषयन्तु, तथा चconditionअपि तु कतिपयानां परिस्थितीनां निराकरणाय तस्य उपयोगः भवति ।

      @Cacheable(cacheNames = "myCache", key = "#id", unless = "#result == null")
    5. कीलजननकर्ता: कस्टम् कैश कुञ्जीजननरणनीतिं निर्दिशन्तु यदि भवन्तः अधिकजटिलकुंजीजननतर्कस्य आवश्यकतां अनुभवन्ति तर्हि भवान् कKeyGeneratorताम्बूलनाम ।

      @Cacheable(cacheNames = "myCache", keyGenerator = "myKeyGenerator")
    6. cacheManager इति:कस्य उपयोगः कर्तव्यः इति निर्दिशतुCacheManager, यदि बहुविधाः सन्तिCacheManagerप्रयुक्ते सति ।

      @Cacheable(cacheNames = "myCache", cacheManager = "myCacheManager")
    7. expireAfterWrite इति : कैश-वस्तु लिखित्वा समाप्तिसमयं (मिलिसेकेण्ड्-मध्ये) सेट् कुर्वन्तु । एतत् सामान्यतया प्रयुक्तं विन्यासः अस्ति यत् संग्रहीतदत्तांशस्य आयुः परिभाषितुं शक्यते ।

      @Cacheable(cacheNames = "myCache", key = "#id", expireAfterWrite = 3600000) // 1小时后过期
    8. expireAfterAccess इति: कैश-वस्तूनाम् अन्तिम-प्रवेशस्य अनन्तरं समाप्ति-समयं सेट् कुर्वन्तु, यत् कैश-दत्तांशस्य अन्तिम-प्रवेशस्य कियत्कालं यावत् उपयुक्तम् अस्ति ।

    9. refreshAfterWrite इति: लेखनस्य अनन्तरं कियत्कालं यावत् संग्रहणं ताजगीं कर्तव्यम् इति सेट् कुर्वन्तु, यत्र सञ्चिका गतिशीलरूपेण ताजगीकृतः भवति तत्र परिदृश्यानां कृते उपयुक्तम् ।

    10. समन्वयनम्: समवर्तीवातावरणेषु जातिस्थितिः निवारयितुं समकालिकरूपेण संग्रहणवस्तूनि निर्मातव्यानि वा इति सेट् कुर्वन्तु ।

  8. अपवादनियन्त्रणम्: अनुप्रयोगस्य स्थिरतां प्रभावितं न कर्तुं कैश-विधिषु क्षिप्ताः अपवादाः नियन्त्रयितुं सुनिश्चितं कुर्वन्तु ।