Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Pola ini memuat data sesuai permintaan ke dalam cache dari penyimpanan data. Gunakan pola ini untuk meningkatkan performa dan membantu menjaga konsistensi antara data dalam cache dan data di penyimpanan data yang mendasar.
Konteks dan masalah
Aplikasi menggunakan cache untuk meningkatkan performa akses berulang ke informasi di penyimpanan data. Tetapi data yang di-cache tidak selalu dapat tetap konsisten dengan penyimpanan data. Aplikasi harus menerapkan strategi yang menjaga data dalam cache selalu seaktual mungkin. Strategi ini juga harus mendeteksi kapan data yang di-cache menjadi kedaluarsa dan menanganinya dengan tepat.
Solusi
Banyak sistem penyimpanan sementara komersial menyediakan operasi baca-melalui dan tulis-melalui atau tulis-belakang. Dalam sistem ini, aplikasi mengambil data dengan mereferensikan cache. Jika data tidak ada di cache, aplikasi mengambilnya dari penyimpanan data dan menambahkannya ke cache. Sistem secara otomatis menulis perubahan apa pun yang dilakukan pada data yang di-cache kembali ke penyimpanan data.
Untuk cache yang tidak menyediakan fungsionalitas ini, aplikasi yang menggunakan cache harus mempertahankan data.
Aplikasi dapat mensimulasikan fungsi penembolokan baca-melalui dengan menerapkan pola Cache-Aside. Strategi ini memuat data ke dalam cache sesuai permintaan. Diagram berikut menggunakan pola Cache-Aside untuk menyimpan data dalam cache.
Aplikasi menentukan apakah item saat ini berada di cache dengan mencoba membaca dari cache.
Jika item tidak ada di cache, juga dikenal sebagai cache miss, aplikasi mengambil item dari penyimpanan data.
Aplikasi menambahkan item ke cache lalu mengembalikannya ke pemanggil.
Jika aplikasi memperbarui informasi, aplikasi dapat mengikuti strategi write-through dengan membuat modifikasi ke penyimpanan data dan membatalkan item yang sesuai di cache.
Ketika item diperlukan lagi, pola Cache-Aside mengambil data yang diperbarui dari penyimpanan data dan menambahkannya ke cache.
Masalah dan pertimbangan
Pertimbangkan poin-poin berikut saat Anda memutuskan cara menerapkan pola ini:
Masa pakai data yang di-cache: Banyak cache menggunakan kebijakan kedaluwarsa untuk membatalkan data dan menghapusnya dari cache jika tidak diakses untuk periode yang ditetapkan. Untuk memastikan cache-aside berfungsi efektif, pastikan bahwa kebijakan kedaluwarsa cocok dengan pola akses untuk aplikasi yang memanfaatkan data. Jangan membuat periode kedaluwarsa terlalu pendek karena kedaluwarsa dini dapat menyebabkan aplikasi terus mengambil data dari penyimpanan data dan menambahkannya ke cache. Demikian pula, jangan membuat periode kedaluwarsa begitu lama sehingga data yang di-cache menjadi kedaluwarsa. Penembolokan berfungsi paling baik untuk data yang bersifat statis atau sering dibaca oleh aplikasi.
Mengusir data: Sebagian besar cache memiliki ukuran terbatas dibandingkan dengan penyimpanan data tempat data berasal. Jika cache melebihi batas ukurannya, cache akan mengeluarkan data. Sebagian besar cache mengadopsi kebijakan yang paling tidak baru-baru ini digunakan untuk memilih item untuk pengeluaran, tetapi beberapa mengizinkan penyesuaian.
Konfigurasi: Anda dapat mengonfigurasi perilaku cache secara global atau per item cache. Satu kebijakan pengusiran global mungkin tidak cocok untuk semua item. Jika item mahal untuk diambil, konfigurasikan item cache satu per satu. Dalam situasi ini, masuk akal untuk menyimpan item di cache, bahkan jika diakses lebih jarang daripada item yang lebih murah.
Priming cache: Banyak solusi yang telah mengisi cache dengan data yang mungkin diperlukan aplikasi sebagai bagian dari pemrosesan startup. Pola Cache-Aside tetap berguna ketika beberapa data ini kedaluwarsa atau dikeluarkan.
Konsistensi: Pola Cache-Aside tidak menjamin konsistensi antara penyimpanan data dan cache. Misalnya, proses eksternal dapat mengubah item di penyimpanan data kapan saja. Perubahan ini tidak muncul di cache hingga item dimuat lagi. Dalam sistem yang mereplikasi data di seluruh penyimpanan data, sinkronisasi yang sering dapat membuat konsistensi menjadi menantang.
Penyiapan cache lokal: Cache dapat bersifat lokal untuk suatu instans aplikasi dan disimpan dalam memori. Cache-aside berfungsi dengan baik di lingkungan ini jika aplikasi berulang kali mengakses data yang sama. Tetapi cache lokal bersifat pribadi, sehingga instans aplikasi yang berbeda masing-masing dapat memiliki salinan data cache yang sama. Data ini dapat dengan cepat menjadi tidak konsisten di antara cache, sehingga Anda mungkin perlu menghapus data dalam cache privat dan memperbaruinya lebih sering. Dalam skenario ini, pertimbangkan untuk menggunakan mekanisme caching bersama atau terdistribusi.
Penembolokan semantik: Beberapa beban kerja dapat memperoleh manfaat dari melakukan pengambilan cache berdasarkan arti semantik daripada kunci yang tepat. Pendekatan ini mengurangi jumlah permintaan dan token yang dikirim ke model bahasa. Hanya gunakan caching semantik saat data mendukung kesetaraan semantik, tidak berisiko mengembalikan respons yang tidak terkait, dan tidak berisi data privat dan sensitif. Misalnya, "Berapa gaji bawa pulang tahunan saya?" secara semantik mirip dengan "Apa gaji bawa pulang tahunan saya?" Tetapi jika pengguna yang berbeda mengajukan pertanyaan-pertanyaan ini, jawabannya harus berbeda. Anda juga tidak boleh menyertakan data sensitif ini dalam cache Anda.
Kapan menggunakan pola ini
Gunakan pola ini ketika:
Cache tidak menyediakan operasi baca-tayang dan tulis-tayang secara bawaan.
Permintaan sumber daya tidak dapat diprediksi. Pola ini memungkinkan aplikasi memuat data sesuai permintaan. Ini tidak mengasumsikan data mana yang diperlukan aplikasi terlebih dahulu.
Pola ini mungkin tidak cocok ketika:
Data bersifat sensitif atau terkait keamanan. Menyimpan data dalam cache mungkin tidak pantas, terutama ketika beberapa aplikasi atau pengguna berbagi cache. Selalu ambil jenis data ini dari sumber utama.
Himpunan data yang di-cache bersifat statis. Jika data cocok dengan ruang cache yang tersedia, isi cache dengan data pada saat startup dan terapkan kebijakan yang mencegah data itu kadaluwarsa.
Sebagian besar permintaan tidak mengalami hit cache. Dalam situasi ini, biaya tambahan dari memutuskan penggunaan cache dan memuat data ke dalamnya mungkin melebihi manfaat penyimpanan sementara.
Anda menyimpan informasi status sesi dalam aplikasi web yang dihosting di farm web. Di lingkungan ini, hindari memperkenalkan dependensi berdasarkan afinitas klien-server.
Desain beban kerja
Evaluasi cara menggunakan pola Cache-Aside dalam desain beban kerja untuk mengatasi tujuan dan prinsip yang tercakup dalam pilar Azure Well-Architected Framework. Tabel berikut memberikan panduan tentang bagaimana pola ini mendukung tujuan setiap pilar.
| Pilar | Bagaimana pola ini mendukung tujuan pilar |
|---|---|
| Keputusan desain Keandalan membantu beban kerja Anda menjadi tangguh tidak berfungsi dan memastikan bahwa memulihkan ke keadaan yang berfungsi penuh setelah kegagalan terjadi. | Penembolokan mereplikasi data. Dengan cara terbatas, ini dapat mempertahankan ketersediaan data yang sering diakses jika penyimpanan data asal menjadi tidak tersedia untuk sementara waktu. Jika cache tidak berfungsi, beban kerja dapat kembali ke penyimpanan data asal. - RE:05 Redundansi |
| Efisiensi Performa membantu beban kerja Anda memenuhi permintaan secara efisien melalui pengoptimalan dalam penskalaan, data, dan kode. | Caching meningkatkan performa untuk data yang banyak pembacaan, jarang berubah, dan memiliki toleransi terhadap sedikit keusangan. - Kinerja data PE:08 - Pengoptimalan performa berkelanjutan PE:12 |
Jika pola ini memperkenalkan kompromi di dalam pilar, bandingkan dengan tujuan pilar lain.
Contoh
Pertimbangkan untuk menggunakan Azure Managed Redis untuk membuat cache terdistribusi yang dapat dibagikan oleh beberapa instans aplikasi.
Contoh berikut menggunakan klien StackExchange.Redis , yang merupakan pustaka klien Redis yang ditulis untuk .NET. Untuk menyambungkan ke instans Azure Managed Redis, panggil metode statis ConnectionMultiplexer.Connect dan teruskan string koneksi. Metode mengembalikan ConnectionMultiplexer yang mewakili koneksi.
Salah satu cara untuk berbagi ConnectionMultiplexer instans di aplikasi Anda adalah dengan memiliki properti statis yang mengembalikan instans yang terhubung, mirip dengan contoh berikut. Pendekatan ini menyediakan cara rangkaian-aman untuk menginisialisasi hanya satu instans yang terhubung.
private static ConnectionMultiplexer Connection;
// Redis connection string information
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
string cacheConnection = ConfigurationManager.AppSettings["CacheConnection"].ToString();
return ConnectionMultiplexer.Connect(cacheConnection);
});
public static ConnectionMultiplexer Connection => lazyConnection.Value;
Metode GetMyEntityAsync dalam contoh berikut menunjukkan implementasi pola Cache-Aside. Metode ini mengambil objek dari cache dengan menggunakan pendekatan metode read-through.
Metode mengidentifikasi objek dengan menggunakan ID bilangan bulat sebagai kunci. Ini mencoba mengambil item dari cache dengan menggunakan kunci ini. Jika cache berisi item yang cocok, cache akan mengembalikan item. Jika cache tidak berisi kecocokan, GetMyEntityAsync metode mengambil objek dari penyimpanan data, menambahkannya ke cache, lalu mengembalikannya. Contoh ini menghilangkan kode yang membaca data dari penyimpanan data karena logika tersebut bergantung pada penyimpanan data. Item yang di-cache dikonfigurasi agar kedaluwarsa untuk mencegahnya menjadi tidak terbaru jika layanan atau proses lain memperbaruinya.
// Set five minute expiration as a default
private const double DefaultExpirationTimeInMinutes = 5.0;
public async Task<MyEntity> GetMyEntityAsync(int id)
{
// Define a unique key for this method and its parameters.
var key = $"MyEntity:{id}";
var cache = Connection.GetDatabase();
// Try to get the entity from the cache.
var json = await cache.StringGetAsync(key).ConfigureAwait(false);
var value = string.IsNullOrWhiteSpace(json)
? default(MyEntity)
: JsonConvert.DeserializeObject<MyEntity>(json);
if (value == null) // Cache miss
{
// If there's a cache miss, get the entity from the original store and cache it.
// Code has been omitted because it is data store dependent.
value = ...;
// Avoid caching a null value.
if (value != null)
{
// Put the item in the cache with a custom expiration time that
// depends on how critical it is to have stale data.
await cache.StringSetAsync(key, JsonConvert.SerializeObject(value)).ConfigureAwait(false);
await cache.KeyExpireAsync(key, TimeSpan.FromMinutes(DefaultExpirationTimeInMinutes)).ConfigureAwait(false);
}
}
return value;
}
Catatan
Contoh menggunakan Azure Managed Redis untuk mengakses penyimpanan dan mengambil informasi dari cache. Untuk informasi selengkapnya, lihat Buat instans Azure Managed Redis dan Gunakan Azure Managed Redis di .NET.
Metode berikut UpdateEntityAsync menunjukkan cara membatalkan objek dalam cache ketika aplikasi mengubah nilai. Kode memperbarui penyimpanan data asli dan kemudian menghapus item yang di-cache dari cache.
public async Task UpdateEntityAsync(MyEntity entity)
{
// Update the object in the original data store.
await this.store.UpdateEntityAsync(entity).ConfigureAwait(false);
// Invalidate the current cache object.
var cache = Connection.GetDatabase();
var id = entity.Id;
var key = $"MyEntity:{id}"; // The key for the cached object.
await cache.KeyDeleteAsync(key).ConfigureAwait(false); // Delete this key from the cache.
}
Catatan
Urutan langkah itu penting. Perbarui penyimpanan data sebelum menghapus item dari cache. Jika Anda menghapus item yang di-cache terlebih dahulu, ada jendela waktu kecil ketika klien mungkin mengambil item sebelum penyimpanan data diperbarui. Dalam situasi ini, pengambilan menghasilkan kesalahan cache karena item tidak ada di cache. Ketidakberhasilan pencarian cache menyebabkan aplikasi mengambil item yang sudah usang dari penyimpanan data dan menambahkannya kembali ke cache. Urutan ini menyebabkan data kedaluarsa dalam cache.
Langkah berikutnya
Primer Konsistensi Data: Primer ini menjelaskan masalah konsistensi pada data yang terdistribusi. Ini juga meringkas bagaimana aplikasi dapat menerapkan konsistensi akhir untuk menjaga ketersediaan data. Aplikasi cloud biasanya menyimpan data di beberapa penyimpanan data dan lokasi. Anda harus mengelola dan menjaga konsistensi data secara efisien di lingkungan ini, terutama karena masalah konkurensi dan ketersediaan yang dapat muncul.
Gunakan Azure Managed Redis sebagai cache semantik: Tutorial ini menunjukkan bagaimana cara menerapkan cache semantik dengan menggunakan Azure Managed Redis.
Sumber daya terkait
Pola Reliable Web App: Pola ini menerapkan pola Cache-Aside ke aplikasi web di cloud.
Panduan caching: Panduan ini memberikan informasi lebih lanjut tentang cara men-cache data dalam solusi cloud, dan masalah yang perlu dipertimbangkan saat Anda menerapkan cache.