Caching Objek WordPress: Redis, Memcached, dan API asli

Diterbitkan: 2017-11-04

Situs WordPress tingkat perusahaan yang dapat menskalakan sesuka hati, memerlukan mekanisme caching persisten di luar halaman dan gambar, mekanisme yang dapat men-cache objek PHP yang sebenarnya. Meskipun WordPress menyediakan mekanisme caching objek melalui WordPress Object Cache, ada solusi lain yang menawarkan daya ungkit dan kekuatan yang besar. Tetapi sebelum kita masuk ke semua itu, pertama-tama, kita perlu melihat apa itu cache objek dan bagaimana cara kerjanya di PHP.

Apa itu cache objek?

PHP adalah bahasa berorientasi objek. Ia menggunakan paradigma Object untuk menyusun kode. Akibatnya, situs WordPress Anda terdiri dari banyak Objek PHP berbeda yang terus-menerus dibuat, dipakai, dan dihancurkan (oleh manajer memori). Membuat dan menghancurkan objek memerlukan biaya tambahan, terutama jika jumlahnya banyak. Namun, sebagian besar cenderung sering digunakan kembali karena mewakili fungsionalitas inti. Ini berarti bahwa setiap kali aplikasi membutuhkannya lagi, aplikasi harus membuat instance dari awal.

Bagaimana jika Anda dapat men-cache objek instantiated yang sering digunakan sehingga Anda tidak perlu menghancurkan dan membuatnya sepanjang waktu?

Anda dapat menggunakan fungsi serialise() PHP untuk mengonversi objek atau primitif ke representasi angka (byte blob) yang dapat disimpan dalam memori, atau disk untuk akses nanti. Kemudian Anda menghitung nomor hash byte blob menggunakan fungsi hash() dan menyimpan keduanya. Hash sebagai kunci dan byte blob sebagai nilai. Untuk mengambilnya, Anda menggunakan nomor hash yang dihitung dari byte blob yang awalnya disimpan sebagai kunci. Anda dapat mengubah apa pun (String, Integer, Object, Boolean, Array, dll) menjadi representasi nilai yang dapat disimpan dengan cara ini.

Contoh:

$serialized = serialize( array ( 'test' ));

Lakukan operasi sebaliknya, dengan unserialize():

$original = unserialize ( $serialized );

Secara umum, ada tiga cara Anda dapat men-cache objek: Menggunakan Cache Objek WordPress asli, API Transien, atau penyimpanan nilai kunci eksternal seperti Redis atau Memcached.

Caching Objek WordPress

WordPress menawarkan dua API cache objek: Cache Objek WordPress asli dan API Transien. Mereka identik, dan meskipun ini dapat menyebabkan kebingungan, ada logika di baliknya.

Cache Objek WordPress asli dapat menyimpan objek dan primitif dalam cache, tetapi tidak secara terus-menerus secara default. Ini berarti bahwa caching terjadi di memori, dan objek yang di-cache tidak hidup di luar siklus masa pakai permintaan. Jadi, Anda tidak dapat membagikan objek yang di-cache di berbagai pemuatan halaman. Anda perlu menyediakan implementasi toko Anda sendiri dengan menggunakan Drop-Ins, yang merupakan plugin “lanjutan” yang dapat memperluas fungsionalitas WordPress. Anda dapat melihatnya di dasbor WordPress Anda, di daftar plugin:

Drop-In WordPress

Transients API, di sisi lain, bekerja di luar kotak. Anda dapat menyimpan variabel, array, objek yang diikat dengan tanggal kedaluwarsa secara langsung di database dan memiliki cache objek yang persisten. Namun, masalahnya adalah ketika objek yang di-cache kedaluwarsa, objek tersebut tetap berada di database yang menghabiskan ruang. Ini berarti bahwa ada biaya tambahan yang dihabiskan dalam memelihara database, memangkas sesekali objek yang kadaluwarsa.

WordPress mendeteksi jika Anda telah mengimplementasikan cache objek persisten Anda sendiri dan ketika menemukan bahwa hal itu terjadi, panggilan ke API Transien dilewati dan dialihkan ke WordPress Object Cache (dan dengan demikian alasannya identik).

Pengembang dapat mengimplementasikan cache objek mereka sendiri, menggunakan plugin WordPress (lebih lanjut tentang itu nanti) atau implementasi kami sendiri, jika klien Pressidium. Kami tidak mengaktifkan cache objek secara default, karena ini dapat menyebabkan penalti kinerja jika digunakan dalam situasi yang salah. Tidak ada solusi "satu ukuran untuk semua" dalam hal caching objek di situs WordPress.

Redis dan Memcached

Penyimpanan nilai kunci tidak menggunakan tabel dan tipe data yang telah ditentukan sebelumnya untuk menyimpan informasi dalam catatan seperti di RDBMS. Mereka dirancang untuk menyimpan dan mengambil pasangan kunci/nilai, seperti dalam kamus struktur data yang Anda temukan dalam bahasa pemrograman.

Salah satu contoh bagus dari toko tersebut adalah Redis. Selain struktur data kamus, ini mendukung banyak yang lain, termasuk yang tingkat lanjut seperti kumpulan yang diurutkan dengan kueri rentang, dan indeks geospasial dengan kueri radius. Ia menawarkan persisten object-caching .

Redis

Redis bukan hanya penyimpanan atau cache nilai kunci. Mendukung replikasi data, scripting, ketersediaan tinggi dalam konfigurasi cluster. Anda juga dapat menyempurnakan tingkat kegigihan pada disk yang Anda inginkan. Hal yang baik tentang Redis adalah jika Anda melakukan restart, sebagian besar cache Anda akan tetap berada di disk, dengan data yang hilang hanya sebagian kecil. Masalahnya adalah saat restart, server harus membangun kembali cache dan ini sering kali meningkatkan beban. Dengan Redis ini tidak terjadi. Selain itu, objek yang kedaluwarsa akan segera dihapus dari database. Tidak ada waktu overhead manajemen di sana juga.

Redis Labs memiliki halaman luar biasa yang menampilkan kasus penggunaan Redis di Perusahaan: Mulai dari Kumpulan Data Sangat Besar, hingga pencarian teks lengkap, Seri Waktu Nyata, integrasi Spark, dan banyak lagi.

Meskipun semua fitur ini membutuhkan kerumitan dan mungkin kecepatan dalam beberapa kasus, mengoptimalkan kode Redis Drop-In Anda dapat mencapai beberapa keuntungan. Jangan lupa fakta bahwa Redis melakukan persisten object-caching , sesuatu yang tidak dilakukan Memcached, meskipun lebih mudah digunakan.

Memcache

Memcached adalah sistem penyimpanan objek berperforma tinggi dalam memori yang menurut situs web resminya, dirancang khusus untuk mempercepat aplikasi web dinamis dan mengurangi beban basis data. Ini juga jauh lebih sederhana dan mudah digunakan daripada Redis.

Karena dirancang khusus untuk melakukan caching objek untuk halaman web, dan fakta bahwa ia menggunakan database dalam memori menjadikannya solusi caching objek tercepat di luar sana. Namun seperti yang telah kami sebutkan sebelumnya, jika server Anda restart, cache Anda akan habis. Dan sampai dibangun kembali, Anda mungkin akan mengalami peningkatan beban. Tetapi seperti yang dikatakan pembuatnya: "anggap itu sebagai memori jangka pendek untuk situs web Anda", jadi itu lebih tergantung pada apa yang ingin Anda lakukan sejak awal.

Karena Memcached menggunakan database dalam memori untuk menyimpan cache, Memcached sangat efisien dalam menyimpan kueri SQL, output panggilan fungsi, dan semacamnya.

Plugin WordPress

  • WP Redis, plugin WordPress Redis resmi. Mendukung WP-CLI, clustering dan replikasi.
  • Redis Object Cache Plugin Redis back-end lainnya untuk WordPress.
  • Memcached Object Cache, backend untuk Memcached.
  • Hapus Transien Kedaluwarsa, plugin ini menghapus objek transien kedaluwarsa dari database. Ini mendukung multisite juga!

Cara menjalankan benchmark

Inti dari artikel kami adalah untuk membuat Anda bersemangat tentang caching objek dan mulai mengotak-atik sendiri. Anda dapat mencoba berbagai implementasi cache persisten dan melihat seberapa baik perilaku aplikasi Anda. Anda dapat menggunakan fungsi microsecond() PHP untuk melakukan benchmark panggilan. Misalnya: Panggil microsecond() sebelum dan sesudah memanggil wp_cache_get() , kurangi nilainya dan simpan hasilnya. Lakukan ini untuk berbagai implementasi cache, dan lihat dalam kasus apa Anda melihat peningkatan kinerja.

Di Pressidium, kami tidak mengaktifkan caching objek secara default dan meskipun ini adalah sesuatu yang dapat diminta, kami biasanya tidak menyarankannya sejak awal. Kami menjalankan pengujian dan memastikan bahwa situs Anda akan memperoleh manfaat darinya.

Kesimpulan

Katakanlah untuk merender halaman, aplikasi perlu membaca 2.000 objek sementara. Itu berarti 2.000 bacaan di database. Dengan menggunakan sistem caching objek persisten, 2.000 pembacaan ini diturunkan ke penyimpanan nilai kunci. Jika Anda menggunakan memcached maka Anda berisiko kehilangan semua cache saat restart tiba-tiba. Secara umum, Redis mungkin tidak secepat Memcached tetapi fitur Enterprise dan ketekunannya menguntungkan Anda dalam jangka panjang.

Namun, satu ukuran tidak cocok untuk semua! Misalnya, kami telah melihat contoh Redis yang benar-benar memperlambat situs web, dan dalam kasus lain di mana mereka sangat mempercepatnya. Ini berkaitan dengan sejumlah objek yang digunakan aplikasi Anda: secara umum, jika aplikasi Anda menggunakan beberapa (katakanlah selusin) Anda tidak akan mendapatkan banyak manfaat dari cache objek, dan dalam kasus terburuk, Anda akan memiliki overhead jaringan. Namun, jika aplikasi Anda berjumlah ratusan maka mungkin akan terbayar untuk melihatnya.