Pengantar JCache

1. Ikhtisar

Sederhananya, JCache adalah API caching standar untuk Java. Dalam tutorial ini, kita akan melihat apa itu JCache dan bagaimana kita bisa menggunakannya.

2. Ketergantungan Maven

Untuk menggunakan JCache, kita perlu menambahkan ketergantungan berikut ke pom.xml kita :

 javax.cache cache-api 1.0.0-PFD 

Perhatikan bahwa kami dapat menemukan versi terbaru pustaka di Repositori Pusat Maven.

Kami juga perlu menambahkan implementasi API ke pom.xml kami ; kami akan menggunakan Hazelcast di sini:

 com.hazelcast hazelcast 3.9-EA 

Kami juga dapat menemukan versi terbaru Hazelcast di Maven Central Repository-nya.

3. Implementasi JCache

JCache diimplementasikan oleh berbagai solusi caching:

  • Implementasi Referensi JCache
  • Hazelcast
  • Koherensi Oracle
  • Ehcache Terracotta
  • Infinispan

Perhatikan bahwa, tidak seperti implementasi referensi lainnya, tidak disarankan untuk menggunakan Implementasi Referensi JCache dalam produksi karena menyebabkan beberapa masalah konkurensi.

4. Komponen Utama

4.1. Cache

The Cache antarmuka memiliki metode yang berguna berikut:

  • get () - mengambil kunci elemen sebagai parameter dan mengembalikan nilai elemen; ia mengembalikan null jika kunci tidak ada di Cache
  • getAll () - beberapa kunci bisa diteruskan ke metode ini sebagai Set; t metode ia kembali kunci yang diberikan dan nilai-nilai terkait sebagai Peta
  • getAndRemove () - metode mengambil nilai menggunakan kuncinya dan menghapus elemen dari Cache
  • put () - menyisipkan item baru di Cache
  • clear () - menghapus semua elemen di Cache
  • containsKey () - memeriksa apakah Cache berisi kunci tertentu

Seperti yang bisa kita lihat, nama metode cukup jelas. Untuk informasi lebih lanjut tentang metode ini dan metode lainnya, kunjungi Javadoc.

4.2. CacheManager

CacheManager adalah salah satu antarmuka API yang paling penting. Ini memungkinkan kami untuk membuat, mengkonfigurasi, dan menutup Cache .

4.3. CachingProvider

CachingProvider adalah antarmuka yang memungkinkan kita membuat dan mengelola siklus hidup CacheManagers .

4.4. Konfigurasi

Konfigurasi adalah antarmuka yang memungkinkan kita untuk mengkonfigurasi Cache . Ini memiliki satu implementasi konkret - MutableConfiguration dan subinterface - CompleteConfiguration .

5. Membuat Cache

Mari kita lihat bagaimana kita bisa membuat Cache sederhana :

CachingProvider cachingProvider = Caching.getCachingProvider(); CacheManager cacheManager = cachingProvider.getCacheManager(); MutableConfiguration config = new MutableConfiguration(); Cache cache = cacheManager .createCache("simpleCache", config); cache.put("key1", "value1"); cache.put("key2", "value2"); cacheManager.close();

Yang kami lakukan hanyalah:

  • Membuat objek CachingProvider , yang kita gunakan untuk membuat objek CacheManager
  • Membuat objek MutableConfiguration , yang merupakan implementasi dari antarmuka Konfigurasi
  • Membuat objek Cache menggunakan objek CacheManager yang kita buat sebelumnya
  • Menempatkan semua entri, kita perlu cache ke objek Cache kita
  • Menutup CacheManager untuk melepaskan sumber daya yang digunakan oleh Cache

Jika kami tidak menyediakan implementasi JCache apa pun di pom.xml kami , pengecualian berikut akan ditampilkan:

javax.cache.CacheException: No CachingProviders have been configured

Alasannya adalah karena JVM tidak dapat menemukan implementasi konkret apa pun dari metode getCacheManager () .

6. Prosesor Entri

EntryProcessor memungkinkan kita untuk memodifikasi entri Cache menggunakan operasi atomic tanpa harus menambahkannya kembali ke Cache . Untuk menggunakannya, kita perlu mengimplementasikan antarmuka EntryProcessor :

public class SimpleEntryProcessor implements EntryProcessor, Serializable { public String process(MutableEntry entry, Object... args) throws EntryProcessorException { if (entry.exists()) { String current = entry.getValue(); entry.setValue(current + " - modified"); return current; } return null; } }

Sekarang, mari gunakan implementasi EntryProcessor kami :

@Test public void whenModifyValue_thenCorrect() { this.cache.invoke("key", new SimpleEntryProcessor()); assertEquals("value - modified", cache.get("key")); }

7. Pendengar Acara

Pendengar Peristiwa memungkinkan kita untuk mengambil tindakan setelah memicu salah satu jenis peristiwa yang ditentukan dalam enum Jenis Peristiwa , yaitu:

  • DIBUAT
  • DIPERBARUI
  • DIHAPUS
  • HADIR

Pertama, kita perlu mengimplementasikan antarmuka dari kejadian yang akan kita gunakan.

Sebagai contoh, jika kita ingin menggunakan DICIPTAKAN dan UPDATED jenis acara, maka kita harus mengimplementasikan antarmuka CacheEntryCreatedListener dan CacheEntryUpdatedListener .

Mari kita lihat contohnya:

public class SimpleCacheEntryListener implements CacheEntryCreatedListener, CacheEntryUpdatedListener, Serializable { private boolean updated; private boolean created; // standard getters public void onUpdated( Iterable
    
      events) throws CacheEntryListenerException { this.updated = true; } public void onCreated( Iterable
     
       events) throws CacheEntryListenerException { this.created = true; } }
     
    

Sekarang, mari kita jalankan pengujian kita:

@Test public void whenRunEvent_thenCorrect() throws InterruptedException { this.listenerConfiguration = new MutableCacheEntryListenerConfiguration( FactoryBuilder.factoryOf(this.listener), null, false, true); this.cache.registerCacheEntryListener(this.listenerConfiguration); assertEquals(false, this.listener.getCreated()); this.cache.put("key", "value"); assertEquals(true, this.listener.getCreated()); assertEquals(false, this.listener.getUpdated()); this.cache.put("key", "newValue"); assertEquals(true, this.listener.getUpdated()); }

8. CacheLoader

CacheLoader memungkinkan kita menggunakan mode baca-tayang untuk memperlakukan cache sebagai penyimpanan data utama dan membaca data darinya .

Dalam skenario dunia nyata, kita dapat membuat cache membaca data dari penyimpanan sebenarnya.

Mari kita lihat contohnya. Pertama, kita harus mengimplementasikan antarmuka CacheLoader :

public class SimpleCacheLoader implements CacheLoader { public String load(Integer key) throws CacheLoaderException { return "fromCache" + key; } public Map loadAll(Iterable keys) throws CacheLoaderException { Map data = new HashMap(); for (int key : keys) { data.put(key, load(key)); } return data; } }

Dan sekarang, mari gunakan implementasi CacheLoader kami :

public class CacheLoaderTest { private Cache cache; @Before public void setup() { CachingProvider cachingProvider = Caching.getCachingProvider(); CacheManager cacheManager = cachingProvider.getCacheManager(); MutableConfiguration config = new MutableConfiguration() .setReadThrough(true) .setCacheLoaderFactory(new FactoryBuilder.SingletonFactory( new SimpleCacheLoader())); this.cache = cacheManager.createCache("SimpleCache", config); } @Test public void whenReadingFromStorage_thenCorrect() { for (int i = 1; i < 4; i++) { String value = cache.get(i); assertEquals("fromCache" + i, value); } } }

9. Kesimpulan

Dalam tutorial ini, kita telah melihat apa itu JCache dan menjelajahi beberapa fitur pentingnya dalam beberapa skenario praktis.

Seperti biasa, implementasi lengkap dari tutorial ini dapat ditemukan di GitHub.