Ada banyak hal yang perlu dipertimbangkan, tetapi secara umum saya akan mendasarkan pemetaan relasional dalam kasus Anda pada Row Data Gateway pola (RDG). Jika Anda tidak memiliki terlalu banyak jenis objek yang berbeda, pendekatan arsitektur ini harus berskala cukup baik. RDG harus memfasilitasi implementasi caching Anda jika Anda membatasi pembukuan cache ke kelas Finder.
Jika Anda punya waktu dan kemauan, lihat Pola Arsitektur Aplikasi Perusahaan dari Martin Fowler . Ini adalah sumber informasi yang bagus.
Sekarang secara spesifik...
- mengidentifikasi data dengan semacam id
Biasanya Anda akan menggunakan beberapa kolom bilangan bulat yang bertambah secara otomatis dalam database untuk ini. Anda dapat menggunakan unordered_map untuk menarik objek tersebut dari cache dengan cepat. Karena Anda memiliki semua objek dalam cache, demi pengoptimalan, Anda juga dapat menerapkan beberapa find*
berfungsi untuk mencari cache terlebih dahulu. Anda dapat menggunakan unordered_map/unordered_multimap untuk 'mengindeks' beberapa data, jika waktu pencarian Anda sangat terbatas, atau tetap menggunakan peta/multimap lama yang bagus. Namun, ini menggandakan pekerjaan, dan Anda sudah memilikinya secara gratis di database untuk jenis kueri ini.
- mengedit data/objek yang di-cache
Data kotor tidak boleh terlihat oleh seluruh sistem sampai Anda benar-benar menulisnya ke database. Setelah Anda menghentikan pembaruan, dan jika semuanya berjalan sesuai keinginan, Anda dapat mengganti objek dalam cache dengan objek yang Anda gunakan untuk pembaruan, atau cukup menghapus objek dalam cache dan membiarkan pembaca lain mengambilnya dari database (yang akan menghasilkan dalam caching objek lagi). Anda dapat menerapkan ini dengan mengkloning objek Gateway asli, tetapi intinya adalah Anda harus menerapkan beberapa strategi penguncian.
- hapus data/objek lama dan tambahkan data/objek baru
Di sini Anda cukup menghapus objek dari cache, dan mencoba menghapusnya dari database. Jika penghapusan gagal dalam database, pembaca lain akan menyimpannya di cache. Pastikan saja tidak ada klien yang dapat mengakses rekaman yang sama saat Anda sedang dalam proses penghapusan. Saat menambahkan catatan baru, Anda cukup membuat instance objek Gateway, meneruskannya ke objek tingkat domain, dan setelah selesai dengan perubahan, panggil insert pada objek Gateway. Anda dapat meletakkan objek Gateway baru ke cache, atau membiarkan pembaca pertama memasukkannya ke dalam cache.
- urutkan data berdasarkan beberapa jenis prioritas (terakhir digunakan)
- Apa cara terbaik untuk men-cache data/objek berdasarkan informasi yang diberikan DAN MENGAPA?
Ini adalah masalah memilih algoritme caching terbaik. Ini bukan pertanyaan yang mudah untuk dijawab, tetapi LRU seharusnya berfungsi dengan baik. Tanpa metrik yang sebenarnya, tidak ada jawaban yang benar, tetapi LRU mudah diterapkan dan jika tidak sesuai dengan kebutuhan Anda, lakukan saja metrik dan putuskan algoritme baru. Pastikan Anda dapat melakukannya dengan mulus dengan memiliki antarmuka yang baik ke cache. Satu hal lain yang perlu diingat adalah bahwa objek tingkat domain Anda tidak boleh bergantung pada batas cache Anda. Jika Anda membutuhkan 100 ribu objek, tetapi Anda hanya memiliki 50 ribu cache , Anda masih memiliki 100 ribu objek di memori, tetapi 50 ribu di antaranya ada di cache. Dengan kata lain, objek Anda tidak boleh bergantung pada status cache Anda, dan juga tidak akan peduli jika Anda memiliki cache sama sekali.
Selanjutnya, jika Anda masih menggunakan ide RDG, Anda cukup menyimpan objek Gateway di cache Anda. Anda dapat menyimpan instance objek Gateway di cache Anda melalui shared_ptr, tetapi juga harus mempertimbangkan Anda mengunci strategi (optimis vs pesimis), jika Anda ingin menghindari penulisan kotor. Juga, semua Gateway Anda (satu untuk setiap tabel), dapat mewarisi antarmuka yang sama, sehingga Anda dapat menggeneralisasi strategi simpan/muat Anda, dan juga, Anda akan dapat menggunakan kumpulan tunggal sambil menjaga semuanya tetap sederhana. (Lihat boost::pool. Mungkin ini bisa membantu Anda dengan implementasi cache.)
Satu poin terakhir:
Kue itu bohong! :D Apa pun yang Anda putuskan untuk dilakukan, pastikan bahwa itu didasarkan pada jumlah metrik kinerja yang layak. Jika Anda meningkatkan kinerja sebesar 20%, dan Anda menghabiskan waktu 2 bulan untuk melakukannya, mungkin ada baiknya memikirkan untuk menambahkan beberapa giga RAM lagi ke perangkat keras Anda. Buat beberapa bukti konsep yang mudah diverifikasi, yang akan memberi Anda informasi yang cukup apakah mengimplementasikan cache Anda membayar, dan jika tidak, coba beberapa solusi yang teruji dan andal dari rak (memcache atau semacamnya, seperti yang sudah dikomentari @Layne).