Pengenalan kepada JCache

1. Gambaran keseluruhan

Secara sederhana, JCache adalah API caching standard untuk Java. Dalam tutorial ini, kita akan melihat apa itu JCache dan bagaimana kita dapat menggunakannya.

2. Pergantungan Maven

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

 javax.cache cache-api 1.0.0-PFD 

Perhatikan bahawa kami dapat mencari versi terbaru perpustakaan di Maven Central Repository.

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

 com.hazelcast hazelcast 3.9-EA 

Kami juga boleh menemui versi terbaru Hazelcast di Maven Central Repositorynya.

3. Pelaksanaan JCache

JCache dilaksanakan dengan pelbagai penyelesaian caching:

  • Pelaksanaan Rujukan JCache
  • Hazelcast
  • Koherensi Oracle
  • Terakota Ehcache
  • Infinispan

Perhatikan bahawa, tidak seperti pelaksanaan rujukan lain, tidak digalakkan menggunakan JCache Reference Implementation dalam pengeluaran kerana menyebabkan beberapa masalah bersamaan.

4. Komponen Utama

4.1. Cache

Antara muka Cache mempunyai kaedah berguna berikut:

  • get () - mengambil kunci elemen sebagai parameter dan mengembalikan nilai elemen; ia kembali nol jika kunci tidak ada di Cache
  • getAll () - beberapa kunci boleh diteruskan ke kaedah ini sebagai Set; t dia kaedah pulangan kunci yang diberikan dan nilai-nilai yang berkaitan sebagai Peta
  • getAndRemove () - kaedah mengambil nilai menggunakan kuncinya dan mengeluarkan elemen dari Cache
  • put () - memasukkan item baru di Cache
  • clear () - membuang semua elemen dalam Cache
  • mengandungKey () - memeriksa sama ada Cache mengandungi kunci tertentu

Seperti yang kita lihat, nama kaedahnya cukup jelas. Untuk maklumat lebih lanjut mengenai kaedah ini dan kaedah lain, lawati Javadoc.

4.2. Pengurus Cache

CacheManager adalah salah satu antara muka API yang paling penting. Ini membolehkan kita membuat, mengkonfigurasi dan menutup Cache .

4.3. Penyedia Caching

CachingProvider adalah antara muka yang membolehkan kita membuat dan mengurus kitaran hidup CacheManagers .

4.4. Konfigurasi

Konfigurasi adalah antara muka yang membolehkan kita mengkonfigurasi Cache . Ia mempunyai satu pelaksanaan konkrit - MutableConfiguration dan subinterface - CompleteConfiguration .

5. Membuat Cache

Mari lihat bagaimana kita dapat membuat Cache yang mudah :

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 buat hanyalah:

  • Membuat objek CachingProvider , yang kita gunakan untuk membina objek CacheManager
  • Membuat objek MutableConfiguration , yang merupakan implementasi antara muka Konfigurasi
  • Membuat objek Cache menggunakan objek CacheManager yang kita buat sebelumnya
  • Meletakkan semua entri, kita perlu memasukkan objek ke dalam Cache kita
  • Menutup CacheManager untuk melepaskan sumber yang digunakan oleh Cache

Sekiranya kami tidak memberikan pelaksanaan JCache di pom.xml kami , pengecualian berikut akan dilemparkan:

javax.cache.CacheException: No CachingProviders have been configured

Sebabnya ialah JVM tidak dapat menemui pelaksanaan konkrit kaedah getCacheManager () .

6. Pemproses Masuk

EntryProcessor membolehkan kita mengubah entri Cache menggunakan operasi atom tanpa perlu menambahkannya semula ke Cache . Untuk menggunakannya, kita perlu melaksanakan antara muka 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 pelaksanaan EntryProcessor kami :

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

7. Pendengar Acara

Pendengar Acara membolehkan kami mengambil tindakan setelah mencetuskan salah satu jenis acara yang ditentukan dalam enum EventType , yang:

  • DIPERCAYAI
  • DIKEMASKINI
  • DILEPASKAN
  • TAMBAHAN

Pertama, kita perlu melaksanakan antara muka peristiwa yang akan kita gunakan.

Sebagai contoh, jika kita ingin menggunakan jenis peristiwa CREATED dan UPDATED , maka kita harus melaksanakan antara muka CacheEntryCreatedListener dan CacheEntryUpdatedListener .

Mari lihat contoh:

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 jalankan ujian kami:

@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 membolehkan kita menggunakan mod baca-baca untuk memperlakukan cache sebagai penyimpanan data utama dan membaca data darinya .

Dalam senario dunia nyata, kita dapat meminta cache membaca data dari storan sebenar.

Mari kita lihat contohnya. Pertama, kita harus melaksanakan antara muka 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 pelaksanaan 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. Kesimpulannya

Dalam tutorial ini, kami telah melihat apa itu JCache dan meneroka beberapa ciri pentingnya dalam beberapa senario praktikal.

Seperti biasa, pelaksanaan penuh tutorial ini boleh didapati di GitHub.