Κοινή χρήση τεχνολογίας

Το SpringBoot υλοποιεί τη λειτουργία Read Through

2024-07-12

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

Εισαγωγή

Η λειτουργία "Ανάγνωση μέσω" αναφέρεται γενικά σε μια στρατηγική αποθήκευσης στην κρυφή μνήμη κατά την οποία όταν μια εφαρμογή επιχειρεί να διαβάσει δεδομένα, το σύστημα κρυφής μνήμης ελέγχεται πρώτα για να διαπιστωθεί εάν τα δεδομένα βρίσκονται ήδη στη μνήμη cache. Εάν τα δεδομένα υπάρχουν στην κρυφή μνήμη (δηλαδή επίσκεψη στην κρυφή μνήμη), τα δεδομένα διαβάζονται απευθείας από τη μνήμη cache και επιστρέφονται στην εφαρμογή. Εάν τα δεδομένα δεν υπάρχουν στη μνήμη cache (δηλαδή, μια έλλειψη προσωρινής μνήμης), τα δεδομένα διαβάζονται από τον υποκείμενο χώρο αποθήκευσης δεδομένων (όπως μια βάση δεδομένων), στη συνέχεια φορτώνονται στη μνήμη cache και, τέλος, επιστρέφονται στην εφαρμογή.

Τα κύρια πλεονεκτήματα αυτού του μοντέλου περιλαμβάνουν:

  1. Βελτιώστε την απόδοση: Η απόδοση της ανάκτησης δεδομένων μπορεί να βελτιωθεί σημαντικά με τη μείωση του αριθμού των άμεσων προσβάσεων στον υποκείμενο χώρο αποθήκευσης.
  2. Μειώστε την καθυστέρηση: Η κρυφή μνήμη βρίσκεται συνήθως στη μνήμη και μπορεί να προσπελαστεί πολύ πιο γρήγορα από την αποθήκευση στο δίσκο, μειώνοντας έτσι τον λανθάνοντα χρόνο ανάκτησης δεδομένων.
  3. Μειώστε το φόρτο της βάσης δεδομένων: Αποθηκεύοντας δεδομένα με συχνή πρόσβαση στην κρυφή μνήμη, η πίεση ερωτήματος στη βάση δεδομένων μπορεί να μειωθεί, βελτιώνοντας έτσι την απόδοση ολόκληρου του συστήματος.

Η λειτουργία Read Through συνήθως έρχεται σε αντίθεση με στρατηγικές όπως Lazy Loading και Eager Loading:

  • Lazy Loading: Τα δεδομένα φορτώνονται μόνο όταν χρειάζεται, γεγονός που μειώνει την περιττή φόρτωση δεδομένων αλλά μπορεί να αυξήσει τον λανθάνοντα χρόνο κατά την πρώτη πρόσβαση.
  • Eager Loading: Προφόρτωση δεδομένων, τα οποία μπορούν να μειώσουν τον λανθάνοντα χρόνο πρώτης πρόσβασης, αλλά μπορεί να αυξήσουν τη χρήση μνήμης και τον χρόνο εκκίνησης της εφαρμογής σας.

Κατά την εφαρμογή της λειτουργίας Read Through, ίσως θελήσετε να λάβετε υπόψη τα εξής:

  • Στρατηγική ακύρωσης προσωρινής μνήμης: Καθορίστε πότε θα αφαιρεθούν δεδομένα από τη μνήμη cache, όπως με βάση το χρόνο (TTL) ή με βάση το διάστημα (όταν η κρυφή μνήμη φτάσει σε ένα συγκεκριμένο μέγεθος).
  • Έλεγχος συγχρονισμού: Χειριστείτε την κατάσταση όπου πολλές παρουσίες εφαρμογών έχουν πρόσβαση και τροποποιούν την κρυφή μνήμη ταυτόχρονα.
  • συνοχή δεδομένων: Βεβαιωθείτε ότι τα δεδομένα στη μνήμη cache είναι συνεπή με τα δεδομένα στην υποκείμενη αποθήκευση, ειδικά όταν τα δεδομένα ενημερώνονται.

ολοκληρώσει

Η εφαρμογή του μοτίβου Read Through στο Spring Boot μπορεί συνήθως να επιτευχθεί μέσω της αφαίρεσης Spring Cache. Η Spring Cache παρέχει ένα ενοποιημένο API σε διαφορετικές εφαρμογές κρυφής μνήμης και υποστηρίζει πολλαπλές λύσεις προσωρινής μνήμης, όπως EhCache, Hazelcast, Infinispan, Redis κ.λπ.

  1. Προσθήκη εξαρτήσεων: Αρχικά, πρέπει να προσθέσετε τις εξαρτήσεις προσωρινής μνήμης του Spring Boot και την επιλεγμένη βιβλιοθήκη υλοποίησης προσωρινής μνήμης (όπως το 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@EnableCachingσχολιασμός για να ενεργοποιήσετε την υποστήριξη σχολιασμού προσωρινής μνήμης.

  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 Σχολιασμοί για την εφαρμογή της λειτουργίας Ανάγνωσης. Εάν δεν υπάρχουν δεδομένα στη μνήμη cache, η μέθοδος θα κληθεί και το αποτέλεσμα θα αποθηκευτεί προσωρινά.
    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Το κλειδί της κρυφής μνήμης καθορίζεται στον σχολιασμό, ο οποίος συνήθως βασίζεται στην τιμή της παραμέτρου της μεθόδου.

  6. όνομα κρυφής μνήμης: Καθορίστε το όνομα της κρυφής μνήμης, το οποίο θα χρησιμοποιηθεί για τη διάκριση διαφορετικών τομέων κρυφής μνήμης.

  7. Διαμόρφωση παραμέτρων προσωρινής μνήμης: Μπορείτε να διαμορφώσετε το χρονικό όριο λήξης της προσωρινής μνήμης, τις συνθήκες, εκτός εάν οι συνθήκες κ.λπ. απαιτείται

    1. τιμή ή cacheNames : Καθορίστε το όνομα της προσωρινής μνήμης. Μπορείτε να καθορίσετε ένα ή περισσότερα ονόματα κρυφής μνήμης που θα χρησιμοποιηθούν για την αποθήκευση της κρυφής μνήμης.

      @Cacheable(value = "myCacheName", key = "#id")
    2. κλειδί : Καθορίστε τη στρατηγική δημιουργίας για τις τιμές κλειδιών της κρυφής μνήμης. Οι εκφράσεις 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: Καθορίστε μια προσαρμοσμένη στρατηγική δημιουργίας κλειδιού προσωρινής μνήμης Εάν χρειάζεστε πιο σύνθετη λογική δημιουργίας κλειδιών, μπορείτε να καθορίσετε α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. Εξαίρεση χειρισμού: Βεβαιωθείτε ότι χειρίζεστε τις εξαιρέσεις που ενδέχεται να περιληφθούν σε μεθόδους προσωρινής μνήμης για να αποφύγετε να επηρεάσετε τη σταθερότητα της εφαρμογής.