Pengusiran Cache di Spring Boot

1. Ikhtisar

Dalam tutorial singkat ini, kita akan belajar bagaimana kita bisa melakukan penggusuran cache menggunakan Spring. Kami akan membuat contoh kecil untuk mendemonstrasikan ini.

Sebelum melanjutkan, lihat artikel kami - Panduan Untuk Caching di Musim Semi - untuk memahami cara kerja cache Musim Semi.

2. Bagaimana cara Mengusir Cache?

Spring menyediakan dua cara untuk mengeluarkan cache, baik dengan menggunakan anotasi @CacheEvict pada sebuah metode atau dengan menghubungkan CacheManger secara otomatis dan mengosongkannya dengan memanggil metode clear () .

Berikut cara kedua mekanisme penggusuran cache ini dapat diterapkan dalam kode.

2.1. Menggunakan @CacheEvi

Mari buat metode kosong dengan anotasi @CacheEvict dan berikan nama cache yang ingin kita hapus sebagai argumen anotasi (dalam hal ini, kita ingin menghapus cache dengan nama "pertama"):

@CacheEvict(value = "first", allEntries = true) public void evictAllCacheValues() {}

Spring akan mencegat semua metode yang dianotasi dengan @CacheEvict dan menghapus semua nilai berdasarkan bendera allEntries . Mungkin saja untuk mengeluarkan nilai berdasarkan kunci tertentu.

Untuk ini, yang harus kita lakukan adalah meneruskan kunci cache sebagai argumen ke anotasi alih- alih tanda allEntries :

@CacheEvict(value = "first", key = "#cacheKey") public void evictSingleCacheValue(String cacheKey) {}

Karena nilai atribut key dinamis, kita dapat menggunakan Spring Expression Language atau generator kunci khusus dengan mengimplementasikan KeyGenerator untuk memilih argumen yang diminati atau properti bertingkat.

2.2. Menggunakan CacheManager

Selanjutnya, mari kita lihat bagaimana kita dapat mengeluarkan cache menggunakan CacheManager yang disediakan oleh modul Spring Cache. Pertama, kita harus mengirim kacang CacheManager secara otomatis .

Dan kemudian kita dapat menghapus cache berdasarkan kebutuhan kita:

@Autowired CacheManager cacheManager; public void evictSingleCacheValue(String cacheName, String cacheKey) { cacheManager.getCache(cacheName).evict(cacheKey); } public void evictAllCacheValues(String cacheName) { cacheManager.getCache(cacheName).clear(); }

Seperti yang bisa kita lihat di kode, metode clear () akan menghapus semua entri cache dan metode evict () akan menghapus nilai berdasarkan kunci .

3. Bagaimana Cara Mengusir Semua Cache?

Spring tidak menyediakan fungsionalitas di luar kotak untuk menghapus semua cache. Tapi kita bisa mencapai ini dengan mudah dengan menggunakan metode getCacheNames () dari manajer cache.

3.1. Penggusuran atas Permintaan

Sekarang mari kita lihat bagaimana kita dapat menghapus semua cache sesuai permintaan. Untuk membuat titik pemicu, kita harus mengekspos titik akhir terlebih dahulu:

@RestController public class CachingController { @Autowired CachingService cachingService; @GetMapping("clearAllCaches") public void clearAllCaches() { cachingService.evictAllCaches(); } }

Di CachingService , kita kemudian dapat menghapus semua cache dengan melakukan iterasi atas nama cache yang diperoleh dari manajer cache :

public void evictAllCaches() { cacheManager.getCacheNames().stream() .forEach(cacheName -> cacheManager.getCache(cacheName).clear()); }

3.2. Penggusuran Otomatis

Ada kasus penggunaan tertentu di mana pengusiran cache harus dilakukan secara otomatis pada interval tertentu. Dalam hal ini, kita dapat menggunakan penjadwal tugas Spring :

@Scheduled(fixedRate = 6000) public void evictAllcachesAtIntervals() { evictAllCaches(); }

4. Kesimpulan

Kami telah mempelajari cara mengusir cache dengan berbagai cara. Salah satu hal yang perlu diperhatikan tentang mekanisme ini adalah ia akan bekerja dengan semua implementasi cache yang beragam seperti eh-cache, infini-span, apache-ignite, dll.

Seperti biasa, semua contoh yang disebutkan dalam tutorial ini dapat ditemukan di Github.