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 MB (10^6 byte).
  • Panjang kunci tidak boleh lebih dari 250 byte. Dalam runtime Python, kunci yang berupa string dengan panjang lebih dari 250 byte akan di-hash.
  • 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.

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
8.000 1000
5000 2500
1000 4500
0 5000

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.

Bandingkan dan atur

Bandingkan dan atur adalah fitur yang memungkinkan beberapa permintaan yang sedang ditangani secara serentak untuk mengupdate nilai kunci memcache yang sama secara atomik, sehingga menghindari kondisi race.

Komponen logis utama dari bandingkan dan atur

Jika Anda mengupdate nilai kunci memcache yang mungkin menerima permintaan tulis serentak lainnya, Anda harus menggunakan objek Client memcache, yang menyimpan informasi status tertentu yang digunakan oleh metode yang mendukung bandingkan dan atur. Anda tidak dapat menggunakan fungsi memcache get() atau set(), karena fungsi tersebut bersifat stateless. Class Client itu sendiri tidak aman untuk thread, jadi Anda tidak boleh menggunakan objek Client yang sama di lebih dari satu thread.

Saat mengambil kunci, Anda harus menggunakan metode Client memcache yang mendukung bandingkan dan atur: gets() atau get_multi() dengan parameter for_cas yang disetel ke True.

Saat mengupdate kunci, Anda harus menggunakan metode Client memcache yang mendukung bandingkan dan atur: cas() atau cas_multi().

Komponen logis utama lainnya adalah layanan memcache App Engine dan perilakunya terkait bandingkan dan atur. Layanan memcache App Engine itu sendiri berperilaku atomik. Artinya, jika dua permintaan serentak (untuk id aplikasi yang sama) menggunakan memcache, keduanya akan mengarah ke instance layanan memcache yang sama, dan layanan memcache memiliki penguncian internal yang cukup sehingga permintaan serentak untuk kunci yang sama diserialisasi dengan benar. Secara khusus, ini berarti bahwa dua permintaan cas() untuk kunci yang sama tidak benar-benar berjalan secara paralel -- layanan ini menangani permintaan pertama yang masuk hingga selesai (yaitu, mengupdate nilai dan stempel waktu) sebelum mulai menangani permintaan kedua.

Untuk mempelajari cara menggunakan bandingkan dan atur di Python, baca Menangani penulisan serentak.

Langkah selanjutnya