Pengantar Ehcache

1. Ikhtisar

Pada artikel ini, kami akan memperkenalkan Ehcache, cache berbasis Java sumber terbuka yang banyak digunakan. Ini fitur penyimpanan memori dan disk, pendengar, pemuat cache, API RESTful dan SOAP dan fitur lain yang sangat berguna.

Untuk menunjukkan bagaimana caching dapat mengoptimalkan aplikasi kita, kita akan membuat metode sederhana yang akan menghitung nilai kuadrat dari bilangan yang disediakan. Pada setiap panggilan, metode tersebut akan memanggil metode countSquareOfNumber (int number) dan mencetak pesan informasi ke konsol.

Dengan contoh sederhana ini, kami ingin menunjukkan bahwa kalkulasi nilai kuadrat dilakukan hanya sekali, dan setiap panggilan lainnya dengan nilai input yang sama mengembalikan hasil dari cache.

Penting untuk diperhatikan bahwa kami berfokus sepenuhnya pada Ehcache itu sendiri (tanpa Spring); jika Anda ingin melihat bagaimana Ehcache bekerja dengan Spring, lihatlah membaca artikel ini.

2. Ketergantungan Maven

Untuk menggunakan Ehcache kita perlu menambahkan ketergantungan Maven ini:

 org.ehcache ehcache 3.1.3 

Versi terbaru dari artefak Ehcache dapat ditemukan di sini.

3. Konfigurasi Cache

Ehcache dapat dikonfigurasi dengan dua cara:

  • Cara pertama adalah melalui Java POJO di mana semua parameter konfigurasi dikonfigurasi melalui Ehcache API
  • Cara kedua adalah melakukan konfigurasi melalui file XML dimana kita dapat mengkonfigurasi Ehcache sesuai dengan definisi skema yang diberikan

Dalam artikel ini, kami akan menunjukkan kedua pendekatan - Java serta konfigurasi XML.

3.1. Konfigurasi Java

Subbagian ini akan menunjukkan betapa mudahnya mengkonfigurasi Ehcache dengan POJO. Selain itu, kami akan membuat kelas helper untuk konfigurasi dan ketersediaan cache yang lebih mudah:

public class CacheHelper { private CacheManager cacheManager; private Cache squareNumberCache; public CacheHelper() { cacheManager = CacheManagerBuilder .newCacheManagerBuilder().build(); cacheManager.init(); squareNumberCache = cacheManager .createCache("squaredNumber", CacheConfigurationBuilder .newCacheConfigurationBuilder( Integer.class, Integer.class, ResourcePoolsBuilder.heap(10))); } public Cache getSquareNumberCacheFromCacheManager() { return cacheManager.getCache("squaredNumber", Integer.class, Integer.class); } // standard getters and setters }

Untuk menginisialisasi cache kita, pertama, kita perlu mendefinisikan objek Ehcache CacheManager . Dalam contoh ini, kami membuat cache default squaredNumber ” dengan newCacheManagerBuilder () API .

Cache hanya akan memetakan Integer kunci Integer nilai-nilai.

Perhatikan bagaimana, sebelum kita mulai menggunakan cache yang ditentukan, kita perlu menginisialisasi objek CacheManager dengan metode init () .

Terakhir, untuk mendapatkan cache kita, kita cukup menggunakan getCache () API dengan tipe nama, kunci dan nilai yang disediakan dari cache kita.

Dengan beberapa baris itu, kami membuat cache pertama kami yang sekarang tersedia untuk aplikasi kami.

3.2. Konfigurasi XML

Objek konfigurasi dari sub-bagian 3.1. sama dengan menggunakan konfigurasi XML ini:

 java.lang.Integer java.lang.Integer 10 

Dan untuk memasukkan cache ini ke dalam aplikasi Java kita, kita perlu membaca file konfigurasi XML di Java:

URL myUrl = getClass().getResource(xmlFile); XmlConfiguration xmlConfig = new XmlConfiguration(myUrl); CacheManager myCacheManager = CacheManagerBuilder .newCacheManager(xmlConfig);

4. Tes Ehcache

Di bagian 3. kami menunjukkan bagaimana Anda dapat mendefinisikan cache sederhana untuk tujuan Anda. Untuk menunjukkan bahwa caching benar-benar berfungsi, kita akan membuat kelas SquaredCalculator yang akan menghitung nilai kuadrat dari input yang diberikan, dan menyimpan nilai yang dihitung dalam cache.

Tentu saja, jika cache sudah berisi nilai yang dihitung, kami akan mengembalikan nilai yang di-cache dan menghindari perhitungan yang tidak perlu:

public class SquaredCalculator { private CacheHelper cache; public int getSquareValueOfNumber(int input) { if (cache.getSquareNumberCache().containsKey(input)) { return cache.getSquareNumberCache().get(input); } System.out.println("Calculating square value of " + input + " and caching result."); int squaredValue = (int) Math.pow(input, 2); cache.getSquareNumberCache().put(input, squaredValue); return squaredValue; } //standard getters and setters; }

Untuk menyelesaikan skenario pengujian kami, kami juga memerlukan kode yang akan menghitung nilai kuadrat:

@Test public void whenCalculatingSquareValueAgain_thenCacheHasAllValues() { for (int i = 10; i < 15; i++) { assertFalse(cacheHelper.getSquareNumberCache().containsKey(i)); System.out.println("Square value of " + i + " is: " + squaredCalculator.getSquareValueOfNumber(i) + "\n"); } for (int i = 10; i < 15; i++) { assertTrue(cacheHelper.getSquareNumberCache().containsKey(i)); System.out.println("Square value of " + i + " is: " + squaredCalculator.getSquareValueOfNumber(i) + "\n"); } }

Jika kami menjalankan pengujian kami, kami akan mendapatkan hasil ini di konsol kami:

Calculating square value of 10 and caching result. Square value of 10 is: 100 Calculating square value of 11 and caching result. Square value of 11 is: 121 Calculating square value of 12 and caching result. Square value of 12 is: 144 Calculating square value of 13 and caching result. Square value of 13 is: 169 Calculating square value of 14 and caching result. Square value of 14 is: 196 Square value of 10 is: 100 Square value of 11 is: 121 Square value of 12 is: 144 Square value of 13 is: 169 Square value of 14 is: 196

Seperti yang Anda perhatikan, metode hitung () melakukan penghitungan hanya pada panggilan pertama. Pada panggilan kedua, semua nilai ditemukan di cache dan dikembalikan darinya.

5. Opsi Konfigurasi Ehcache Lainnya

Saat kami membuat cache di contoh sebelumnya, itu adalah cache sederhana tanpa opsi khusus. Bagian ini akan menampilkan opsi lain yang berguna dalam pembuatan cache.

5.1. Persistensi Disk

Jika ada terlalu banyak nilai untuk disimpan ke dalam cache, kami dapat menyimpan beberapa nilai tersebut di hard drive.

PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder() .with(CacheManagerBuilder.persistence(getStoragePath() + File.separator + "squaredValue")) .withCache("persistent-cache", CacheConfigurationBuilder .newCacheConfigurationBuilder(Integer.class, Integer.class, ResourcePoolsBuilder.newResourcePoolsBuilder() .heap(10, EntryUnit.ENTRIES) .disk(10, MemoryUnit.MB, true)) ) .build(true); persistentCacheManager.close();

Alih-alih CacheManager default , sekarang kami menggunakan PersistentCacheManager yang akan mempertahankan semua nilai yang tidak dapat disimpan ke dalam memori.

Dari konfigurasi, kita dapat melihat bahwa cache akan menyimpan 10 elemen ke dalam memori dan akan mengalokasikan 10MB pada hard drive untuk persistensi.

5.2. Data Kedaluwarsa

Jika kita menyimpan banyak data, wajar jika kita menyimpan data yang di-cache untuk beberapa periode waktu sehingga kita dapat menghindari penggunaan memori yang besar.

Ehcache mengontrol kesegaran data melalui antarmuka Kedaluwarsa :

CacheConfiguration cacheConfiguration = CacheConfigurationBuilder .newCacheConfigurationBuilder(Integer.class, Integer.class, ResourcePoolsBuilder.heap(100)) .withExpiry(Expirations.timeToLiveExpiration(Duration.of(60, TimeUnit.SECONDS))).build();

Dalam cache ini, semua data akan hidup selama 60 detik dan setelah jangka waktu tersebut, akan dihapus dari memori.

6. Kesimpulan

Dalam artikel ini, kami menunjukkan cara menggunakan tembolok Ehcache sederhana di aplikasi Java.

Dalam contoh kami, kami melihat bahwa cache yang hanya dikonfigurasi dapat menghemat banyak operasi yang tidak perlu. Selain itu, kami menunjukkan bahwa kami dapat mengkonfigurasi cache melalui POJO dan XML dan bahwa Ehcache memiliki beberapa fitur bagus - seperti persistensi dan kedaluwarsa data.

Seperti biasa, kode dari artikel ini dapat ditemukan di GitHub.