Tutorial Laravel: Contoh Penggunaan Redis

Thumbnail Tutorial Laravel: Contoh Penggunaan Redis

Redis adalah salah satu alat untuk menyimpan data sementara (Cache) yang memiliki kemampuan pengaksesan yang cepat sehingga dapat meningkatkan performa pada berbagai aplikasi, termasuk aplikasi berbasis web yang dibuat dengan Laravel. Contoh penggunaan sederhana adalah pada data yang sering diakses seperti data artikel yang dapat disimpan sebagai Cache dengan menggunakan Redis, karena dapat mengurangi beban server dan mempercepat waktu akses.

Beruntungnya, Laravel telah menyediakan facade untuk pengelolaan Redis secara langsung atau pun melalui facade Cache. Pada artikel ini penulis akan membahas tutorial penggunaan Redis di Laravel untuk optimasi performa latency pengaksesan data.

Ada beberapa hal yang perlu disiapkan untuk mencoba implementasi Redis di Laravel, yaitu:

  1. Proyek Laravel

  2. Data dummy yang cukup banyak

  3. Redis Server

  4. Aplikasi untuk simulasi penggunaan API (Postman)

Penulis menyarankan penggunaan aplikasi Laragon untuk mempercepat keperluan pada poin 1 dan 3. Karena aplikasi Laragon telah menyediakan Redis Server tanpa konfigurasi yang ribet, cukup buka Preferences pada aplikasi Laragon dan arahkan pada tab menu Services & Ports, kemudian aktifkan Redis dengan menceklisnya, setelah beberapa saat dan jika berhasil akan muncul status Redis server yang secara default akan berjalan di port 6379.

Baca juga: Cara Implementasi JWT di Laravel untuk RESTful API.

Kebutuhan untuk poin ke-2 adalah menyediakan data dummy yang cukup banyak, penulis membuat data dummy dengan memanfaatkan Seeder dan Factory yang telah disediakan Laravel. Kurang lebih penulis membuat 10.0000 data yang kemudian disimpan pada database.

Poin ke-4 adalah aplikasi untuk simulasi penggunaan API, Postman dipilih karena penulis cukup terbiasa dalam menggunakannya dan juga memberikan informasi latency atau waktu respons, yang mana hal tersebut diperlukan untuk mengukur performa sebelum dan sesudah menggunakan Redis.

Saya berasumsi bahwa ke-4 poin di atas telah terpenuhi, jadi mari kita integrasikan proyek Laravel dengan Redis. Pertama, bukalah terminal Laragon dan arahkan pada direktori root proyek Laravel, kemudian install package Predis dengan menggunakan perintah:

composer require predis/predis

Untuk memastikan bahwa Redis Server siap digunakan, Anda dapat memasukkan command redis-cli pada terminal. Jika diarahkan pada 127.0.0.1:6379 maka Redis telah siap.

Buka file .env pada proyek Laravel, kemudian sesuaikan nilai pada beberapa bagian berikut:

CACHE_STORE=redis
REDIS_CLIENT=predis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

Saya akan mencoba untuk get data langsung ke database dengan kode seperti di bawah ini.

<?php

namespace App\Http\Controllers;

use App\Models\Post
;
class PostController extends Controller
{
    public function getPosts() {
        $posts = Post::orderBy('created_at', 'DESC')->get();
        
        return response()->json([
            'status' => 'success',
            'data' => [
                'posts' => $posts
            ]
        ]);
    }
}

Berikut adalah hasilnya saat diuji menggunakan aplikasi Postman.

Hasil Pengujian Sebelum Menggunakan Redis

Lihatlah pada bagian yang saya beri garis berwarna merah, latency atau waktu repons yang diperlukan Laravel tanpa Redis untuk mengambil 10.000 data adalah 1.392 ms atau 1.4 detik.
Kemudian saya akan mengubah kode tadi agar data yang diambil pertama kali disimpan sebagai Cache dengan menggunakan Redis, sehingga pengambilan data berikutnya akan hit ke Cache terlebih dahulu dan jika data yang dimaksud tersedia pada Cache maka data itulah yang akan diberikan. Berikut adalah contoh sederhana penggunaan Redis yang menggunakan kondisi if else.

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Support\Facades\Redis;

class PostController extends Controller
{
    public function getPosts() {
        // cek data tersedia pada cache?
        if (Redis::exists('posts')) {
            // ambil data dari cache
            $posts = json_decode(Redis::get('posts'), true);
        } else {
            // ambil data dari database
            $posts = Post::orderBy('created_at', 'DESC')->get();
            
            // simpan ke cache
            $encodedPosts = json_encode($posts);
            Redis::set('posts', $encodedPosts);
        }
        
        return response()->json([
            'status' => 'success',
            'data' => [
                'posts' => $posts
            ]
        ]);
    }
}

Kemudian cobalah untuk get data lagi menggunakan Postman dua kali, karena percobaan pertama akan masuk pada kondisi else, percobaan kedua dan seterusnya akan mengambil dari Cache yakni saat kondisi if terpenuhi.

Hasil Pengujian Setelah Menggunakan Redis

Perhatikan kotak berwarna merah! Latency-nya menurun drastis, menjadi hanya 216 ms atau 0.2 detik setelah disimpan sebagai Cache menggunakan Redis. Hal tersebut mengalami peningkatan performa sangat besar, yaitu sekitar 85%. Hal tersebut dikarenakan Laravel tidak perlu lagi melakukan query ke database, jadi setiap ada permintaan pengambilan data, Laravel akan cek terlebih dahulu pada Cache yang ada.

Bagaimana data yang tersimpan pada Cache bisa sesuai dengan yang dibutuhkan? Tentu saja karena data yang disimpan tersebut memiliki kata kunci (key), sehingga data diambil berdasarkan kata kunci tertentu. Perhatikan kode berikut:

$encodedPosts = json_encode($posts);
Redis::set('posts', $encodedPosts);

Pada contoh ini, saya memberikan ‘posts’ sebagai kata kunci dan nilainya diisi dengan apa yang ada di dalam variabel $encodedPosts. Apa isi dari variabel ini $encodedPosts? Isinya adalah hasil query yang diambil dari database yang berjenis collection dan disimpan pada variabel $posts. Karena isi variabel $posts adalah collection, maka perlu diencode menjadi string terlebih dahulu dengan menggunakan fungsi json_encode(). Hal ini disebabkan Redis tidak mendukung nilai berupa array atau collection, itulah sebabnya setelah data dari Cache diambil (saat kondisi if terpenuhi) maka perlu didecode menjadi array atau collection lagi dengan menggunakan fungsi json_decode().

Bagaimana jika data mengalami perubahan? Tentu saja Cache yang tersimpan juga perlu diperbarui dengan cara menghapusnya jika menggunakan facade Redis. Berikut adalah beberapa method dasar yang sering saya gunakan pada facade Redis di Laravel.

  • Redis::set(‘key’, ‘value’) digunakan untuk menyimpan data.

  • Redis::exists(‘key’) digunakan untuk memastikan keberadaan data kata kunci.

  • Redis::del(‘key’) digunakan untuk menghapus data berdasarkan suatu kata kunci.

  • Redis::flushall() digunakan untuk menghapus semua data.

  • Redis::get(‘key’) digunakan untuk mengambil data.

Masih ada beberapa method lain yang disediakan, tidak saya sebut karena saya belum pernah menggunakannya. Jika Anda penasaran, silahkan kunjungi halaman dokumentasi Laravel mengenai Redis.

Jika berbicara mengenai kemudahan dalam mengelola Cache, sebenarnya Laravel telah menyediakan facade Cache yang memiliki method untuk mengatur waktu kadaluarsa dan driver-nya bisa menggunakan Redis. Akan tetapi setelah saya mencobanya, performa yang diberikan lebih unggul saat menggunakan facade Redis secara langsung.

Performa yang diberikan saat menggunakan facade Cache tidak jauh berbeda dengan query langsung ke database, saya merasa mungkin karena saya belum bisa menggunakannya dengan benar. Hingga akhirnya saya bertanya pada ChatGPT mengenai performa yang dihasilkan saat menggunakan facade Redis dan facade Cache, ChatGPT memberikan penjelasan bahwa buruknya performa saat menggunakan facade Cache dapat disebabkan karena abtraksi yang mendukung berbagai teknik caching membuat Laravel harus melalui beberapa layer terlebih dahulu.

Kesimpulan yang dapat diambil dari tulisan ini adalah penggunaan Redis dalam mengelola Cache dapat meningkatkan performa yang signifikan pada aplikasi Laravel perihal latency atau waktu respons, bahkan pada proyek dengan skala kecil.  Mohon maaf bila terdapat kekurangan, semoga dapat membantu dan terima kasih.