Berbagi teknologi

SpringBoot mengimplementasikan mode Baca Melalui

2024-07-12

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

Perkenalan

Mode Baca Melalui umumnya mengacu pada strategi caching di mana ketika aplikasi mencoba membaca data, sistem cache diperiksa terlebih dahulu untuk melihat apakah data sudah ada dalam cache. Jika data ada di cache (yaitu cache hit), data dibaca langsung dari cache dan dikembalikan ke aplikasi. Jika data tidak ada dalam cache (yaitu, cache hilang), data dibaca dari penyimpanan data yang mendasarinya (seperti database), kemudian dimuat ke dalam cache, dan akhirnya dikembalikan ke aplikasi.

Keuntungan utama model ini meliputi:

  1. Meningkatkan kinerja: Kinerja pengambilan data dapat ditingkatkan secara signifikan dengan mengurangi jumlah akses langsung ke penyimpanan yang mendasarinya.
  2. Kurangi latensi: Cache biasanya terletak di memori dan dapat diakses lebih cepat dibandingkan penyimpanan disk, sehingga mengurangi latensi pengambilan data.
  3. Mengurangi beban basis data: Dengan menyimpan data yang sering diakses dalam cache, tekanan kueri pada database dapat dikurangi, sehingga meningkatkan throughput seluruh sistem.

Mode Read Through biasanya dikontraskan dengan strategi seperti Lazy Loading dan Eager Loading:

  • Pemuatan Malas: Data hanya dimuat saat diperlukan, sehingga mengurangi pemuatan data yang tidak perlu namun dapat meningkatkan latensi pada akses pertama.
  • Memuat dengan penuh semangat: Pramuat data, yang dapat mengurangi latensi akses pertama namun dapat meningkatkan penggunaan memori dan waktu startup aplikasi Anda.

Saat menerapkan mode Read Through, Anda mungkin ingin mempertimbangkan hal berikut:

  • Strategi pembatalan cache: Menentukan kapan harus menghapus data dari cache, seperti berbasis waktu (TTL) atau berbasis ruang (saat cache mencapai ukuran tertentu).
  • Kontrol konkurensi: Menangani situasi ketika beberapa instance aplikasi mengakses dan mengubah cache secara bersamaan.
  • konsistensi data: Memastikan data di cache konsisten dengan data di penyimpanan yang mendasarinya, terutama saat data diperbarui.

menyelesaikan

Menerapkan pola Read Through di Spring Boot biasanya dapat dilakukan melalui abstraksi Spring Cache. Spring Cache menyediakan API terpadu di berbagai implementasi cache dan mendukung beberapa solusi cache, seperti EhCache, Hazelcast, Infinispan, Redis, dll.

  1. Tambahkan dependensi: Pertama, Anda perlu menambahkan dependensi cache Spring Boot dan pustaka implementasi cache yang dipilih (seperti 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. Aktifkan anotasi cache:Tambahkan kelas konfigurasi Spring Boot@EnableCachinganotasi untuk mengaktifkan dukungan anotasi cache.

  3. Konfigurasikan manajer cache: Konfigurasikan satu atau lebihCacheManager, Spring Boot secara otomatis akan mengkonfigurasi yang sederhanaCacheManager, namun Anda dapat mengonfigurasi strategi cache yang lebih kompleks jika diperlukan.

    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. Gunakan anotasi cache: Digunakan pada metode yang memerlukan cache@Cacheable Anotasi untuk menerapkan mode Baca Melalui. Jika tidak ada data di cache, metode akan dipanggil dan hasilnya akan di-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. Kunci cache:ada@CacheableKunci cache ditentukan dalam anotasi, yang biasanya didasarkan pada nilai parameter metode.

  6. nama cache: Tentukan nama cache, yang akan digunakan untuk membedakan domain cache yang berbeda.

  7. Konfigurasikan parameter cache: Anda dapat mengonfigurasi batas waktu cache, kondisi, kecuali kondisi, dll. sesuai kebutuhan

    1. nilai atau nama cache : Tentukan nama cache. Anda dapat menentukan satu atau lebih nama cache yang akan digunakan untuk menyimpan cache.

      @Cacheable(value = "myCacheName", key = "#id")
    2. kunci : Tentukan strategi pembuatan nilai kunci cache. Ekspresi SpEL (Spring Expression Language) biasanya digunakan untuk menentukan parameter metode sebagai kunci cache.

      @Cacheable(cacheNames = "myCache", key = "#id")
    3. kondisi: Tentukan kondisi untuk cache, dan cache hanya jika kondisi terpenuhi.

      @Cacheable(cacheNames = "myCache", key = "#id", condition = "#id.length() > 3")
    4. kecuali: Tentukan kondisi untuk tidak melakukan cache, danconditionSebaliknya, ini digunakan untuk mengesampingkan situasi tertentu.

      @Cacheable(cacheNames = "myCache", key = "#id", unless = "#result == null")
    5. generator kunci: Tentukan strategi pembuatan kunci cache khusus. Jika Anda memerlukan logika pembuatan kunci yang lebih kompleks, Anda dapat menentukan aKeyGeneratorNama kacang.

      @Cacheable(cacheNames = "myCache", keyGenerator = "myKeyGenerator")
    6. manajer cache:Tentukan mana yang akan digunakanCacheManager, jika ada beberapaCacheManagersaat digunakan.

      @Cacheable(cacheNames = "myCache", cacheManager = "myCacheManager")
    7. berakhirSetelahMenulis : Mengatur waktu kedaluwarsa (dalam milidetik) setelah item cache ditulis. Ini adalah konfigurasi yang umum digunakan untuk menentukan masa pakai data cache.

      @Cacheable(cacheNames = "myCache", key = "#id", expireAfterWrite = 3600000) // 1小时后过期
    8. kedaluwarsaSetelahAkses: Mengatur waktu kedaluwarsa setelah akses terakhir item cache, yang berlaku untuk berapa lama waktu yang diperlukan agar data cache kedaluwarsa setelah akses terakhir.

    9. menyegarkanSetelahMenulis: Mengatur berapa lama cache disegarkan setelah penulisan, sesuai untuk skenario di mana cache disegarkan secara dinamis.

    10. sinkronisasi: Mengatur apakah akan membuat item cache secara sinkron untuk mencegah kondisi balapan di lingkungan bersamaan.

  8. Penanganan pengecualian: Pastikan untuk menangani pengecualian yang mungkin dimasukkan ke dalam metode cache untuk menghindari mempengaruhi stabilitas aplikasi.