Memcache API untuk layanan paket lama

Halaman ini menyediakan ringkasan layanan memcache App Engine. Aplikasi web skalabel berperforma tinggi sering menggunakan cache data dalam memori yang terdistribusi di depan atau sebagai pengganti penyimpanan persisten yang kuat untuk beberapa tugas. Untuk tujuan ini, App Engine menyertakan layanan cache memori. Untuk mempelajari cara mengonfigurasi, memantau, dan menggunakan layanan memcache, baca Menggunakan Memcache.

Kapan cache memori digunakan

Salah satu penggunaan cache memori adalah untuk mempercepat kueri datastore umum. Jika banyak permintaan membuat kueri yang sama dengan parameter yang sama, dan perubahan hasil tidak perlu langsung muncul di situs web, aplikasi dapat meng-cache hasilnya di memcache. Permintaan berikutnya dapat memeriksa memcache, dan hanya menjalankan kueri datastore jika hasilnya tidak ada atau sudah tidak berlaku. Data sesi, preferensi pengguna, dan data lain yang ditampilkan oleh kueri untuk halaman web adalah kandidat yang baik untuk disimpan dalam cache.

Memcache dapat berguna untuk nilai sementara lainnya. Namun, saat mempertimbangkan apakah akan menyimpan nilai hanya dalam memcache dan tidak dicadangkan oleh penyimpanan persisten lainnya, pastikan aplikasi Anda memiliki perilaku yang dapat diterima saat nilai tiba-tiba tidak tersedia. Nilai dapat habis masa berlakunya dari memcache kapan saja, dan dapat berakhir sebelum batas waktu habis masa berlaku yang ditetapkan untuk nilai tersebut. Misalnya, jika ketiadaan data sesi pengguna secara tiba-tiba akan menyebabkan sesi gagal berfungsi, data tersebut mungkin harus disimpan di datastore selain di memcache.

Tingkat layanan

App Engine mendukung dua tingkat layanan memcache:

  • Memcache bersama adalah default gratis untuk aplikasi App Engine. Layanan ini berusaha sebaik mungkin untuk menyediakan kapasitas cache dan bergantung pada permintaan keseluruhan dari semua aplikasi App Engine yang menggunakan layanan memcache bersama.

  • Memcache khusus menyediakan kapasitas cache tetap yang ditetapkan secara eksklusif untuk aplikasi Anda. Biaya ini ditagih berdasarkan GB-jam dari ukuran cache dan mengharuskan penagihan diaktifkan. Memiliki kontrol atas ukuran cache berarti aplikasi Anda dapat memberikan performa secara lebih terprediksi dan dengan lebih sedikit pembacaan dari penyimpanan yang lebih tahan lama dan lebih mahal.

Kedua tingkat layanan memcache menggunakan API yang sama. Untuk mengonfigurasi layanan memcache untuk aplikasi Anda, lihat Menggunakan Memcache.

Tabel berikut merangkum perbedaan antara dua class layanan memcache:

Fitur Memcache Khusus Memcache Bersama
Harga $0,06 per GB per jam Gratis
Kapasitas
us-central
1 hingga 100 GB
asia-northeast1, europe-west, europe-west3, dan us-east1:
1 hingga 20 GB
wilayah lain:
1 hingga 2 GB
Tidak ada kapasitas terjamin
Performa Hingga 10 ribu operasi baca atau 5 ribu operasi tulis (eksklusif) per detik per GB (item < 1 KB). Untuk detail selengkapnya, lihat Statistik cache. Tidak dijamin
Penyimpanan yang tahan lama Tidak Tidak
SLA Tidak ada Tidak ada

Penagihan memcache khusus dikenai biaya per 15 menit. Jika Anda melakukan pembayaran dengan mata uang selain USD, yang berlaku adalah harga yang tercantum dalam mata uang Anda pada SKU Cloud Platform.

Jika aplikasi Anda memerlukan lebih banyak kapasitas memcache, hubungi tim Penjualan kami.

Batas

Batasan berikut berlaku untuk penggunaan layanan memcache:

  • Ukuran maksimum nilai data yang di-cache adalah 1 MiB (2^20 byte) dikurangi ukuran kunci dikurangi overhead yang bergantung pada implementasi, yaitu sekitar 73 byte.
  • Ukuran kunci tidak boleh lebih dari 250 byte. Dalam runtime Java, kunci yang merupakan objek atau string yang berukuran lebih dari 250 byte akan di-hash. (Runtime lainnya berperilaku berbeda.)
  • Operasi batch "multi" dapat memiliki berapa pun elemen. Ukuran total panggilan dan ukuran total data yang diambil tidak boleh lebih dari 32 megabyte.
  • Kunci memcache tidak boleh berisi byte null.

Rekomendasi dan praktik terbaik

Saat menggunakan Memcache, sebaiknya desain aplikasi Anda untuk:

  • Menangani kasus ketika nilai yang di-cache tidak selalu tersedia.

    • Memcache bukan penyimpanan yang tahan lama. Menurut kebijakan pengeluaran, kunci akan dikeluarkan saat cache penuh. Perubahan pada konfigurasi cache atau peristiwa pemeliharaan pusat data juga dapat mengosongkan beberapa atau semua cache.
    • Memcache mungkin mengalami ketidaktersediaan untuk sementara. Operasi Memcache bisa gagal karena berbagai alasan, termasuk perubahan pada konfigurasi cache atau peristiwa pemeliharaan pusat data. Aplikasi harus didesain untuk menangkap operasi yang gagal tanpa mengekspos error ini kepada pengguna akhir. Panduan ini berlaku terutama untuk operasi Set.
  • Gunakan kemampuan pengelompokan API jika memungkinkan.

    • Tindakan ini akan meningkatkan performa dan efisiensi aplikasi, terutama untuk item kecil.
  • Distribusikan beban di seluruh keyspace memcache Anda.

    • Jika satu set atau sekumpulan kecil item memcache mewakili jumlah traffic yang tidak proporsional, penskalaan aplikasi Anda akan terhambat. Panduan ini berlaku untuk operasi/dtk dan bandwidth. Anda dapat mengatasi masalah ini dengan melakukan sharding data secara eksplisit.

      Misalnya, Anda dapat membagi penghitung yang sering diupdate ke beberapa kunci, lalu membacanya kembali dan menjumlahkannya hanya saat Anda memerlukan total. Demikian pula, Anda dapat membagi 500 ribu data yang harus dibaca pada setiap permintaan HTTP di beberapa kunci dan membacanya kembali menggunakan satu panggilan API batch. (Lebih baik jika nilai di-cache dalam memori instance.) Untuk memcache khusus, tingkat akses puncak pada kunci tunggal harus 1-2 kali lebih kecil dari rating per GB.

  • Pertahankan kunci Anda sendiri untuk mengambil nilai dari cache.

    • Memcache tidak menyediakan metode untuk membuat daftar kunci. Karena sifat cache, pembuatan daftar kunci tidak dapat dilakukan tanpa mengganggu cache. Selain itu, beberapa bahasa, seperti Python, kunci panjang hash, dan kunci asli hanya diketahui aplikasi.

API yang tersedia

Memcache App Engine mendukung dua antarmuka: Memcache API tingkat rendah dan spesifikasi JCache. Bagian berikut memberikan informasi selengkapnya tentang setiap antarmuka.

API tingkat rendah

Memcache API tingkat rendah mendukung lebih banyak fungsi dibandingkan dengan JCache. Beberapa contoh di antaranya:

  • Pertambahan dan pengurangan nilai penghitung bilangan bulat secara atomik.
  • Mengekspos lebih banyak statistik cache, seperti jumlah waktu sejak entri yang paling lama tidak digunakan diakses, dan ukuran total semua item dalam cache.
  • Memeriksa dan menetapkan operasi untuk menyimpan data secara bersyarat.
  • Jalankan operasi memcache secara asinkron, menggunakan AsyncMemcacheService.

API level rendah menyediakan MemcacheService dan AsyncMemcacheService untuk mengakses layanan memcache. API ini lebih kaya dari yang disediakan oleh JCache.

Lihat Contoh Memcache untuk contoh penggunaan sinkron dan asinkron untuk Memcache API level rendah.

JCache

App Engine Java SDK mendukung JCache API. JCache menyediakan antarmuka seperti peta ke data yang di-cache. Anda menyimpan dan mengambil nilai dalam cache menggunakan kunci. Kunci dan nilai dapat berupa jenis atau class Serializable. Untuk mengetahui detail selengkapnya, lihat Menggunakan Memcache.

Fitur JCache tidak didukung

JCache tidak mendukung fitur berikut:

  • API pemroses JCache didukung sebagian untuk pemroses yang dapat dieksekusi selama pemrosesan panggilan API aplikasi, seperti untuk pemroses onPut dan onRemove. Pemroses yang memerlukan pemrosesan latar belakang, seperti onEvict, tidak didukung.
  • Aplikasi dapat menguji apakah cache berisi kunci tertentu, tetapi tidak dapat menguji apakah cache berisi nilai tertentu (containsValue() tidak didukung).
  • Aplikasi tidak dapat membuang konten kunci atau nilai cache.
  • Aplikasi tidak dapat mereset statistik cache secara manual.
  • Metode put() tidak menampilkan nilai yang diketahui sebelumnya untuk sebuah kunci. Metode ini selalu menampilkan null.

Bagaimana data yang di-cache habis masa berlakunya

Memcache berisi key-value pair. Pasangan dalam memori setiap saat berubah saat item ditulis dan diambil dari cache.

Secara default, nilai yang disimpan dalam memcache dipertahankan selama mungkin. Nilai dapat dikeluarkan dari cache saat nilai baru ditambahkan ke cache dan cache kehabisan memori. Jika nilai dikeluarkan karena tekanan memori, nilai yang paling lama tidak digunakan akan dikeluarkan terlebih dahulu.

Aplikasi dapat menyediakan waktu habis masa berlaku saat nilai disimpan, baik sebagai jumlah detik yang relatif terhadap saat nilai ditambahkan, atau sebagai waktu epoch Unix absolut di masa mendatang (jumlah detik dari tengah malam 1 Januari 1970). Nilainya akan dikeluarkan paling lambat tanggal ini, meskipun dapat dikeluarkan lebih awal karena alasan lain. Menambahkan nilai yang disimpan untuk kunci yang ada tidak akan memperbarui waktu habis masa berlakunya.

Dalam situasi yang jarang terjadi, nilai juga dapat hilang dari cache sebelum masa berlaku habis karena alasan selain tekanan memori. Meskipun memcache tahan terhadap kegagalan server, nilai memcache tidak disimpan ke disk, sehingga kegagalan layanan dapat menyebabkan nilai menjadi tidak tersedia.

Secara umum, aplikasi tidak seharusnya mengharapkan nilai yang di-cache akan selalu tersedia.

Anda dapat menghapus seluruh cache aplikasi melalui API atau di bagian memcache pada konsol Google Cloud.

Statistik cache

Operasi per detik berdasarkan ukuran item

Memcache khusus dinilai dalam operasi per detik per GB, dengan operasi ditentukan sebagai akses item cache individual, seperti get, set, atau delete. Tingkat operasi bervariasi menurut ukuran item yang kira-kira sesuai dengan tabel berikut. Melebihi tingkat ini dapat menyebabkan peningkatan latensi atau error API.

Tabel berikut memberikan jumlah maksimum operasi get-hit atau set yang berkelanjutan dan eksklusif per GB cache. Perhatikan bahwa operasi get-hit adalah panggilan get yang menemukan bahwa ada nilai yang disimpan dengan kunci yang ditentukan, dan menampilkan nilai tersebut.

Ukuran Item (KB) Maksimum get-hit operasi/dtk Maksimum set operasi/dtk
≤1 10.000 5.000
100 2.000 1.000
512 500 250

Aplikasi yang dikonfigurasi untuk cache berukuran beberapa GB secara teori dapat mencapai tingkat operasi gabungan yang dihitung sebagai jumlah GB dikalikan dengan tingkat per GB. Misalnya, aplikasi yang dikonfigurasi untuk cache 5 GB dapat mencapai 50.000 operasi memcache/dtk pada 1 KB item. Untuk mencapai level ini, dibutuhkan distribusi beban yang baik di seluruh keyspace memcache.

Untuk setiap pola IO, batas yang tercantum di atas adalah untuk operasi baca atau operasi tulis. Untuk operasi baca dan operasi tulis simultan, batasnya ditunjukkan dalam skala geser. Makin banyak operasi baca yang dilakukan, makin sedikit operasi tulis yang dapat dilakukan, dan sebaliknya. Setiap contoh berikut adalah contoh batas IOP untuk operasi baca dan operasi tulis simultan sebesar 1 KB per 1 GB cache:

IOPS Baca IOPS Tulis
10000 0
8000 1.000
5.000 2500
1.000 4500
0 5.000

Unit komputasi Memcache (MCU)

Throughput memcache dapat bervariasi, bergantung pada ukuran item yang Anda akses dan operasi yang ingin dilakukan pada item tersebut. Anda dapat secara kasar mengaitkan biaya dengan operasi dan memperkirakan kapasitas traffic yang dapat diharapkan dari memcache khusus menggunakan unit yang disebut Unit Komputasi Memcache (MCU). MCU ditentukan sedemikian rupa sehingga Anda akan mendapatkan 10.000 MCU per detik per GB memcache khusus. Konsol Google Cloud menunjukkan banyaknya MCU yang saat ini digunakan aplikasi Anda.

Perhatikan bahwa MCU adalah estimasi statistik kasar dan juga bukan unit linier. Setiap operasi cache yang membaca atau menulis nilai memiliki biaya MCU yang sesuai, yang bergantung pada ukuran nilai. MCU untuk set bergantung pada ukuran nilai: 2 kali lipat dari biaya operasi get-hit yang berhasil.

Ukuran item nilai (KB) Biaya MCU untuk get-hit Biaya MCU untuk set
≤1 1,0 2.0
2 1.3 2.6
10 1.7 3.4
100 5.0 10.0
512 20.0 40.0
1024 50.0 100,0

Operasi yang tidak membaca atau menulis nilai memiliki biaya MCU tetap:

Operasi MCU
get-miss 1,0
delete 2.0
increment 2.0
flush 100,0
stats 100,0

Perhatikan bahwa operasi get-miss adalah get yang menemukan bahwa tidak ada nilai yang disimpan dengan kunci yang ditentukan.

Langkah selanjutnya