1. Apa itu cache cache
Kata cache pertama kali berasal dari desain CPU
Ketika CPU ingin membaca data, pertama -tama melihat dari cache CPU, dan segera membacanya dan mengirimkannya ke CPU untuk diproses jika ditemukan; Jika tidak ditemukan, dibaca dari memori yang relatif lambat dan dikirim ke CPU untuk diproses. Pada saat yang sama, blok data di mana data ini berada dipanggil ke dalam cache, sehingga seluruh blok data dapat dibaca dari cache di masa depan tanpa memanggil memori. Mekanisme pembacaan inilah yang membuat laju hit cache baca CPU sangat tinggi (sebagian besar CPU dapat mencapai sekitar 90%), yang berarti bahwa 90% dari data yang akan dibaca CPU lain kali dalam cache CPU, dan hanya sekitar 10% yang perlu dibaca dari memori. Ini sangat menghemat waktu CPU untuk membaca memori secara langsung, dan juga membuat CPU tidak mungkin membaca data tanpa menunggu. Secara umum, urutan di mana CPU membaca data di -cache terlebih dahulu dan kemudian memori.
Kemudian, pertama -tama kami pergi ke Hard Disk Cache, kemudian ke cache aplikasi, cache browser, cache web, dll!
Cache adalah raja! Lai
Cache Musim Semi
Spring Cache adalah set lengkap solusi caching aplikasi yang diberikan oleh aplikasi Spring.
Cache Spring sendiri tidak memberikan implementasi cache, tetapi menggunakan antarmuka terpadu dan spesifikasi kode, konfigurasi, anotasi, dll. Untuk memungkinkan Anda menggunakan berbagai cache dalam aplikasi musim semi tanpa harus terlalu memperhatikan detail cache. Dengan cache pegas, Anda dapat menggunakannya dengan mudah
Berbagai implementasi cache, termasuk ConcurrentMap, EHCACHE 2.X, JCACHE, REDIS, dll.
Definisi cache di musim semi
Definisi cache di musim semi, termasuk di antarmuka org.springframework.cache.cache.
Ini terutama menyediakan metode berikut
// Dapatkan nilai sesuai dengan tombol yang ditentukan <T> t dapat (tombol objek, type <T> Kelas) // Simpan nilai yang ditentukan ke cache sesuai dengan kunci void yang sesuai (tombol objek, nilai objek); // daur ulang nilai void yang ditentukan Evict (kunci objek)
Tidak sulit untuk melihat dari definisi bahwa cache sebenarnya adalah struktur nilai kunci. Kami mengoperasikan nilai yang sesuai melalui kunci yang ditentukan.
Manajer Cache
Cache adalah kumpulan nilai-nilai kunci, tetapi dalam proyek kami, mungkin ada cache yang berbeda dari berbagai topik bisnis, seperti cache pengguna, cache departemen, dll. Cache ini secara logis terpisah. Untuk membedakan cache ini, org.springframework.cache.cachemanager disediakan untuk mengelola berbagai cache. Antarmuka ini hanya berisi dua metode
// Dapatkan cache dari topik yang sesuai sesuai dengan nama cache getCache (nama string); // Dapatkan cache dari semua koleksi topik <string> getCachenames ();
Dalam antarmuka ini, menambahkan dan menghapus operasi tidak diizinkan dilakukan pada cache. Operasi ini harus diselesaikan secara internal oleh berbagai implementasi Cachemanager dan tidak boleh diungkapkan.
Cache berbasis anotasi
Secara teori, operasi cache data tidak terlalu relevan dengan bisnis itu sendiri. Kita harus memisahkan operasi baca dan tulis cache dari logika kode utama. Cara Spring dipisahkan didasarkan pada anotasi (tentu saja, seperti JSR-107, dll. Juga didasarkan pada anotasi).
Spring menyediakan serangkaian anotasi, termasuk @cacheable, @cacheeput, @cacheevict dan anotasi lainnya untuk menyederhanakan operasi cache kami. Anotasi ini terletak di paket org.springframework.cache.notation.
2. Contoh
Contoh sederhana menggunakan boot musim semi menggunakan cache pegas
Mari Bangun Contoh Berdasarkan Cache Boot Spring Langkah Demi Langkah
Buat proyek boot musim semi baru dan perkenalkan dependensi berikut
<Dependencies> <dependency> <GroupId> org.springframework.boot </groupid> <ArtifactId> Spring-boot-starter-cache </arttifactid> </dependency> <sependency> <RoupId> org.springframework.boot </groupid> <Arttifactid> SPRING-BOT-St-Stas-starter.BACTIF.BACTIC </groupid> <ArttifactD> Spring-boots-stasterer.BACTICE </Groupid> <ArTtifactD> Spring-boots-stasterer <GroupId> org.springframework.boot </groupid> <ArTifactId> spring-boot-starter-test </stifactid> <scope> test </seupope> </dependency> </dependencies>
Di antara mereka, pegas-boot-starter-cache adalah ketergantungan utama cache.
Ubah kelas aplikasi dan tambahkan anotasi yang memungkinkan cache @enablecaching
@SpringbootApplication@enableCachingPublic class CachesImpleApplication {public static void main (string [] args) {springApplication.run (cachesimpleapplication.class, args); }}@Enablecache Anotasi memulai mekanisme caching Spring, yang akan memungkinkan aplikasi untuk mendeteksi semua anotasi terkait cache dan mulai bekerja. Ini juga akan membuat kacang cacheManager yang dapat disuntikkan dan digunakan oleh aplikasi kami.
Buat kelas restcontroller baru
@Restcontroller @requestMapping ("/") CacheController kelas publik {@Autowired private CachetestService CachetestService; / ** * Dapatkan informasi berdasarkan ID * * @param ID * @return */ @getMapping ("{id}") tes string publik (@pathvariable ("id") ID string) {return cachetestService.get (id); } / ** * Hapus informasi tentang ID * * @param ID * @return * / @deleteMapping ("{id}") Public String delete (@pathvariable ("id") ID string) {return cachetestservice.delete (id); } / ** * Simpan informasi tentang ID * * @param ID * @return * / @postmapping string publik Simpan (@RequestParam ("id") ID string, @RequestParam ("nilai") nilai string) {return cachetestservice.save (id, nilai); } / ** * Informasi tentang ID baru * * @param ID * @return * / @putMapping ("{id}") Publik pembaruan string (@pathvariable ("id") ID string, @RequestParam ("nilai") nilai string) {return cachetestService.update (id, nilai); }}Kelas ini memanggil layanan untuk mengimplementasikan operasi aktual penambahan, menghapus, memodifikasi, dan memeriksa.
Implementasi Layanan
Selanjutnya, kami ingin mengimplementasikan layanan kami
@ServicePublic kelas SimpleCachetestServiceImpl mengimplementasikan CachetestService {private static final Logger Logger = loggerFactory.getLogger (SimpleCachetestServiceImpl.class); peta akhir pribadi <string, string> entitas = hashmap baru <> (); Publik SimpleCachetestServiceImpl () {Entities.put ("1", "Ini No 1"); } @Autowired Private Cachemanager Cachemanager; @Override @cacheable (cachenames = "test") Public String get (string id) {// Catat waktu pembuatan data, digunakan untuk menguji dan membandingkan waktu lama = tanggal baru (). GetTime (); // Cetak Cachemanager Logger.info yang digunakan ("The Cachemanager is" + Cachemanager); // cetak log logger.info ("Dapatkan nilai dengan id =" + id + ", waktunya adalah" + waktu); return "get value by id =" + id + ", nilainya adalah" + entitas.get (id); } @Override public string delete (string id) {return entitas.remove (id); } @Override Public String Simpan (ID String, Nilai String) {Logger.info ("Simpan Nilai" + Nilai + "Dengan Key" + ID); entitas.put (id, nilai); nilai pengembalian; } @Override Public String Update (ID String, Nilai String) {return entities.put (id, value); }}cache
Pertama, tambahkan anotasi @cacheable ke metode GET dan jalankan tes kode.
Kami menggunakan tukang pos untuk pengujian, alamat tes adalah http: // localhost: 8080/1, browser merespons untuk mendapatkan nilai dengan id = 1, nilai ini no 1, konsol server mencetak dua baris logs
Dapatkan nilai dengan id = 1, nilai ini no 1 dapatkan nilai dengan id = 1, waktunya adalah 1516004770216
Tetapi ketika kita menyegarkan alamat browser lagi, browser kembali secara normal, tetapi konsol tidak lagi mencetak. Alasannya adalah ketika kita menyebutnya kedua kalinya, Spring tidak lagi menjalankan metode, tetapi secara langsung mendapatkan nilai yang di -cache. Cache pegas menemui nilai pengembalian fungsi sebagai kunci dalam tes bernama cache.
Di sini kami menggunakan anotasi @cacheable, dan cacheNames dalam anotasi menentukan cache mana yang dibaca di sini. Di sini, kami akan mencari objek cache yang kuncinya ID di cacheName = "test".
Hapus data yang di -cache
Dalam program di atas, jika kita menghapus nilai yang ditentukan melalui permintaan hapus dan mengirim permintaan hapus ke http: // localhost: 8080/1, pada saat ini, nilainya telah dihapus dari peta, tetapi ketika kita mendapatkan permintaan ke http: // localhost: 8080/1, kita masih bisa mendapatkan nilainya. Ini karena ketika kami menghapus data, kami tidak menghapus data dalam cache. Dalam metode GET sebelumnya, hasil operasi dari metode ini masih disimpan. Musim semi tidak akan membacanya kembali, tetapi akan langsung membaca cache. Saat ini, kami menambahkan anotasi sebelum metode
@Override@cacheevict (cachenames = "test") public string delete (string id) {return entitas.remove (id);}Setelah pengujian, panggilan pertama permintaan GET, nilai pengembalian akan ditampilkan dengan benar sebagai nilai GET dengan ID = 1, nilainya 1
Lalu hubungi permintaan hapus. Hapus data dari cache dan peta, dan hubungi permintaan GET lagi. Pada saat ini, nilai GET oleh ID = 1, nilainya nol, yang berarti bahwa nilainya memang telah dihapus dari cache.
Di sini kami menggunakan anotasi @cacheevict. Cachenames menentukan data cache mana yang akan dihapus. Secara default, parameter metode akan digunakan sebagai kunci yang dihapus.
Perbarui cache
Ketika program mencapai titik ini, jika kami menjalankan permintaan POST, badan permintaan adalah ID = 1 & value = new1. Pada saat ini, cetakan konsol menghemat nilai baru nilai1 dengan kunci 1, dan kode akan menyimpan nilai ke peta, tetapi ketika kami menjalankan permintaan GET, kami akan menemukan bahwa nilai pengembalian masih dalam keadaan sebelumnya. Inilah yang bisa kita gunakan
@Override@Cacheput (cacheNames = "test", key = "#id") Public String Simpan (ID String, Nilai String) {Logger.info ("Simpan Nilai" + Nilai + "Dengan Key" + ID); return entitas.put (id, value);}Eksekusi ulang kode, pertama-tama kami mengirim permintaan hapus untuk menghapus data dari peta dan cache. Kemudian kirim permintaan posting dan tulis data ke peta. Akhirnya, jika Anda mengirim permintaan GET, Anda akan menemukan bahwa nilainya dapat diambil dengan benar sekarang, dan konsol tidak mencetak log data yang diperoleh dari peta.
Anotasi @CachePut digunakan di sini. Fungsi anotasi ini adalah untuk menulis nilai pengembalian metode ke dalam cache yang ditentukan oleh cacheNames sesuai dengan kunci yang diberikan.
Demikian pula, kita perlu menambahkan anotasi @CachePut ke metode put sehingga modifikasi juga dapat menyegarkan data yang di -cache.
Pada titik ini, aplikasi cache sederhana termasuk penambahan, penghapusan, modifikasi dan kueri selesai.
3. Poin -Poin Kunci
Beberapa catatan
Melihat
@Cacheable dan @CachePut keduanya akan memasukkan hasil eksekusi dari metode ke dalam cache sesuai dengan kunci yang ditentukan. Ketika @Cacheable dieksekusi, pertama -tama akan mendeteksi apakah ada data dalam cache. Jika demikian, itu akan dibaca langsung dari cache. Jika tidak, jalankan metode dan masukkan nilai pengembalian ke dalam cache, @CachePut akan menjalankan metode terlebih dahulu, dan kemudian tulis hasil eksekusi ke cache. Metode menggunakan @cacheput pasti akan dieksekusi
Kode sampel lengkap ada di https://github.com/ldwqh0/cache-test
Meringkaskan
Di atas adalah metode menggunakan cache cache di Spring Boot yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!