Cache Bersama - Praktik Terbaik Validasi

14

Saya ingin tahu apa yang akan menjadi pendekatan yang lebih baik untuk membatalkan / memperbarui objek cache.

Prasyarat

  • Memiliki server memcached jarak jauh (berfungsi sebagai cache untuk beberapa aplikasi)
  • Semua server di-host oleh azure (wilayah afinitas, pusat data yang sama)
  • Ukuran objek cache berkisar dari 200 byte hingga 50 kilobyte


Pendekatan 1 (simpan dalam cache secepatnya)

  1. Objek A dibuat -> simpan dalam database dan simpan dalam cache
  2. Objek A diminta oleh klien -> periksa keberadaan cache, jika tidak ambil dari database dan simpan di cache
  3. Objek A diperbarui -> simpan dalam database, simpan dalam cache

Pendekatan 1 tampaknya lebih mudah. Jika sesuatu dibuat, masukkan cache secepatnya. Terlepas dari seseorang akan membutuhkannya.


Pendekatan 2 (toko cache malas)

  1. Objek A dibuat -> simpan dalam basis data
  2. Objek A diminta oleh klien -> periksa keberadaan cache, jika tidak ambil dari database dan simpan di cache
  3. Objek A diperbarui -> simpan dalam basis data, hapus kunci dalam cache

Pendekatan 2 tampaknya lebih sadar akan memori. Dalam pendekatan ini hanya item yang diminta masuk ke cache.


Pertanyaan 1: Dalam pikiran kinerja, apa yang akan menjadi pendekatan yang lebih baik? Memori atau CPU belum masuk hitungan.

Pertanyaan 2: Apakah pemikiran saya semacam optimasi prematur?

Pertanyaan 3: Ada pemikiran lain? Pendekatan lain?

bersembunyi
sumber

Jawaban:

12
  1. Tidak dapat dijawab, kecuali untuk mengatakan itu tergantung. Ada banyak faktor yang akan menentukan pendekatan mana yang akan menjadi yang terbaik dalam kasus Anda, misalnya: Apakah normal untuk objek yang dibuat akan diambil segera setelah dibuat? Berapa rasio pembaruan dengan akses?
  2. Kembali. memutuskan Anda perlu cache: Jika Anda mengoptimalkan tanpa data maka ya, itu optimasi teknis prematur. Saya katakan secara teknis karena pengalaman / kebijaksanaan konvensional mungkin memberi tahu Anda bahwa Anda akan membutuhkan semacam cache. Kembali. memutuskan bagaimana cache akan bekerja dengan baik: ya, itu pasti optimasi prematur.
    • Optimalisasi seringkali bukan tentang menemukan solusi terbaik / paling optimal. Itu harus pergi sebagai berikut:
      1. Temukan kemacetan dalam sistem.
      2. Temukan di mana Anda dapat membuat perbedaan terbesar dengan jumlah pekerjaan paling sedikit.
      3. Lakukan pekerjaan paling sedikit!
      4. Apakah sudah cukup cepat? Jika tidak, buka # 1.
      5. Selesai!
    • Jujur saja, tak satu pun dari pendekatan yang Anda gambarkan terdengar rumit. Mengapa tidak menerapkan keduanya dan melihat mana yang paling baik?
    • Langkah 3 dalam pendekatan # 2 dapat diubah menjadi "Objek A diperbarui -> simpan dalam database, perbarui entri dalam cache".
vaughandroid
sumber
Baqueta, terima kasih atas jawaban Anda. Saya sangat menghargainya.
lurkerbelow
@ lurkerbelow Senang membantu.
vaughandroid
2

memcached mengelola objek dengan kebijakannya sendiri, objek yang di-cache akan kadaluwarsa jika tidak ada yang mengaksesnya atau memcached kehabisan memori. Oleh karena itu, pendekatan pertama Anda bukanlah ide yang baik karena objek Anda dalam memcached akan tetap tidak valid karena kehabisan memori saat Anda membuat objek.

Q1. Pendekatan 2 akan lebih baik dalam hal kinerja karena tidak mengirim objek ke memcached, meskipun peningkatan kinerja sangat sedikit.

Q2. Sulit dikatakan. Anggaplah Anda tahu hambatannya dan buatlah pendekatan yang tidak prematur.

Q3. Ada pendekatan lain seperti cache hanya memcached.

neo
sumber