Selamat datang di bagian ke-52 dari seri tutorial Tutorial Pemrograman kami! Di bagian ini, kita akan membahas teknik caching tingkat lanjut untuk mengoptimalkan performa aplikasi web PHP Anda. Setelah di part sebelumnya kita mempelajari cara membangun middleware kustom, sekarang kita akan melihat bagaimana cara menyimpan data yang sering diakses untuk mengurangi beban server dan meningkatkan kecepatan respon. Prasyarat untuk tutorial ini adalah pemahaman dasar tentang PHP, HTTP, dan konsep caching dasar. Kita juga akan menggunakan Redis sebagai contoh implementasi, jadi pastikan Anda telah menginstalnya atau menggunakan layanan cloud Redis.
Bayangkan Anda adalah seorang pelayan di restoran yang sangat sibuk. Setiap kali pelanggan memesan hidangan yang sama, daripada memasak dari awal, Anda bisa menyiapkan beberapa hidangan populer terlebih dahulu dan menyimpannya di tempat yang mudah dijangkau. Inilah inti dari caching: menyimpan data yang sering diakses agar dapat diambil dengan cepat tanpa harus melakukan komputasi ulang atau mengambilnya dari sumber yang lambat (seperti database). Caching tingkat lanjut melibatkan strategi yang lebih kompleks, seperti invalidasi cache, menggunakan beberapa lapisan cache, dan caching berbasis tag.
Mari kita lihat contoh implementasi caching menggunakan Redis untuk menyimpan hasil query database.
Pastikan Anda telah menginstal Redis. Jika belum, Anda bisa menginstalnya melalui package manager:
sudo apt update
sudo apt install redis-server
Atau gunakan Docker:
docker run -d -p 6379:6379 redis
Berikut adalah contoh kode untuk menyimpan dan mengambil hasil query dari Redis:
connect('127.0.0.1', 6379);
// Fungsi untuk mengambil data dari database (misalnya)
function fetchDataFromDatabase() {
// Simulasi query database yang lambat
sleep(2); // Menunggu 2 detik
return ['id' => 1, 'name' => 'Product A', 'price' => 25.00];
}
// Key untuk menyimpan data di Redis
$cacheKey = 'product:1';
// Cek apakah data ada di cache
if ($redis->exists($cacheKey)) {
// Ambil data dari cache
$product = json_decode($redis->get($cacheKey), true);
echo "Data diambil dari cache.\n";
} else {
// Ambil data dari database
$product = fetchDataFromDatabase();
echo "Data diambil dari database.\n";
// Simpan data di cache dengan expiry time (misalnya 60 detik)
$redis->setex($cacheKey, 60, json_encode($product));
}
// Tampilkan data
print_r($product);
?>
Penjelasan Kode:
Caching berbasis tag memungkinkan Anda untuk meng-invalidate cache secara selektif berdasarkan tag. Misalnya, Anda bisa meng-invalidate semua cache yang terkait dengan 'product' ketika sebuah produk diupdate.
set($key, json_encode($data));
foreach ($tags as $tag) {
$redis->sAdd('tag:' . $tag, $key);
}
}
// Fungsi untuk meng-invalidate cache berdasarkan tag
function invalidateCacheByTag($tag) {
global $redis;
$keys = $redis->sMembers('tag:' . $tag);
foreach ($keys as $key) {
$redis->del($key);
}
$redis->del('tag:' . $tag);
}
// Contoh penggunaan
$product = ['id' => 2, 'name' => 'Product B', 'price' => 30.00];
cacheWithTag('product:2', $product, ['product', 'category:electronics']);
// Invalidate cache untuk tag 'product'
invalidateCacheByTag('product');
?>
Buatlah sebuah sistem caching sederhana untuk menyimpan hasil perhitungan matematika yang kompleks. Gunakan Redis atau sistem caching lainnya. Implementasikan fitur invalidasi cache berdasarkan waktu (TTL) dan manual.