Saya mencari cache dalam memori Java sederhana yang memiliki konkurensi yang baik (jadi LinkedHashMap tidak cukup baik), dan yang dapat diserialkan ke disk secara berkala.
Satu fitur yang saya butuhkan, tetapi yang terbukti sulit ditemukan, adalah cara untuk "mengintip" suatu objek. Maksud saya, mengambil objek dari cache tanpa menyebabkan cache menahan objek lebih lama dari yang seharusnya.
Pembaruan: Persyaratan tambahan yang tidak saya sebutkan adalah bahwa saya harus dapat memodifikasi objek yang di-cache (berisi array mengambang) di tempat.
Adakah yang bisa memberikan rekomendasi?
Jawaban:
Karena pertanyaan ini awalnya ditanyakan, pustaka Guava Google sekarang menyertakan cache yang kuat dan fleksibel. Saya akan merekomendasikan menggunakan ini.
sumber
Ehcache adalah solusi yang cukup bagus untuk ini dan memiliki cara untuk mengintip ( getQuiet () adalah metode) sedemikian rupa sehingga tidak memperbarui stempel waktu idle. Secara internal, Ehcache diimplementasikan dengan sekumpulan peta, seperti ConcurrentHashMap, sehingga memiliki jenis manfaat konkurensi yang serupa.
sumber
Jika Anda membutuhkan sesuatu yang sederhana, apakah ini sesuai dengan tagihan?
Ini tidak akan disimpan ke disk, tetapi Anda bilang ingin sederhana ...
Tautan:
(Seperti yang dikomentari Adam, menyinkronkan peta memiliki kinerja yang baik. Tidak mengatakan bahwa gagasan itu tidak memiliki masalah, tetapi akan cukup sebagai solusi cepat dan kotor.)
sumber
ConcurrentHashMap<WeakReference<T>>
. docs.oracle.com/javase/7/docs/api/java/lang/ref/…Pilihan lain untuk cache java dalam memori adalah cache2k . Kinerja dalam memori lebih unggul dari EHCache dan google guava, lihat halaman benchmark cache2k .
Pola penggunaannya mirip dengan cache lainnya. Berikut ini contohnya:
Jika Anda memiliki google guava sebagai ketergantungan maka mencoba cache jambu biji, mungkin bisa menjadi alternatif yang baik.
sumber
Anda dapat dengan mudah menggunakan imcache . Kode contoh ada di bawah.
sumber
Coba ini:
sumber
public static SimpleCacheManager getInstance() {
haruspublic synchronized static SimpleCacheManager getInstance() {
sebaliknyaif (instance == null) {
tidak benang aman. Dalam hal ini Anda dapat menghapus objek monitor secara bersamaan karena sinkronisasi berlangsung untuk semua panggilan getInstance (), lihat: javaworld.com/article/2073352/core-java/…Coba
@Cacheable
dari aspek jcabi . Dengan anotasi tunggal Anda membuat seluruh hasil metode dapat disimpan dalam cache di memori:Baca juga artikel ini: http://www.yegor256.com/2014/08/03/cacheable-java-annotation.html
sumber
Bagaimana dengan ini: https://commons.apache.org/proper/commons-jcs/ (diperbarui ke alamat baru, karena JCS sekarang ada di Apache Commons)
sumber
Coba Ehcache ? Ini memungkinkan Anda untuk memasukkan algoritme kedaluwarsa caching Anda sendiri sehingga Anda dapat mengontrol fungsionalitas intip Anda.
Anda dapat membuat serial ke disk, database, di cluster dll ...
sumber