Intro
Yo! Ini tulisan pertama saya di komunitas ini. Saya akan coba untuk membahas seputar Redis dengan format Question and Answer (QnA)😁
Seputar Redis
Redis itu apa sih?
Mudahnya, kita dapat menyebut Redis ini sebagai database. Namun, Redis tidak menyimpan datanya di storage seperti database pada umumnya, melainkan ia menyimpan semua datanya di dalam memory.
Oh iya, Redis termasuk keluarga NoSQL ya, karena Redis tidak menyimpan data-datanya dalam bentuk tabel relasi yang rumit seperti MySQL dan kawan-kawan, tetapi hanya dalam bentuk pasangan key-value.
Lebih jelasnya, Key selalu bersifat unik dan berfungsi seperti ID dari satu baris data di tabel database SQL. Sedangkan Value adalah isi data yang terkait dengan Key tadi. Jadi kalau kita mau manggil data yang kita butuhkan, cukup panggil key-nya aja deh. Sederhana bukan?
Mengapa di memory?🤔
Karena akses ke memory lebih cepat dari pada ke storage. Salah satu contoh use case dari Redis adalah digunakan sebagai cache dari aplikasi. Berikut ilustrasi penggunaannya:
Dari ilustrasi di atas, setelah request masuk maka server akan melakukan pencarian terlebih dahulu ke Redis berdasarkan key. Jika key tersebut ditemukan, maka server akan menarik data dari Redis dan kemudian mengirim langsung data tersebut ke user sebagai response. Namun bila key tidak ditemukan, maka server akan melakukan proses pencarian data mentah ke database di storage, lalu memproses data yang diambil, dan kemudian mengirim data hasil sebagai response ke user sekaligus secara parallel menyimpan data hasil ke Redis.
Dengan demikian adanya Redis sebagai cache akan menghemat waktu untuk memproses request karena tidak perlu akses data ke storage dan juga melakukan proses data lagi⚡.
Btw kalo servernya mati datanya ilang dong ya? Kan ditaruh di memory🤔
Tenang, hal ini sudah dipikirkan oleh pembuat Redis nya kok. Berdasarkan artikel yang mereka tulis, terdapat opsi mekanisme untuk menyimpan data ke storage baik dalam bentuk snapshot atau data log secara berkala. Kalian bisa membaca lebih lanjut di sini.
Jika suatu waktu membutuhkan peningkatan performa, apakah kita dapat melakukan scaling di Redis?
Sebelum masuk ke jawaban, mungkin kita perlu ketahui dahulu perbedaan empat jenis teknik scaling di bawah ini ya:
- scale-up vs scale-down
- scale-out vs scale-in
Singkatnya, pada teknik scale-up kita melakukan scaling secara vertikal yaitu dengan menambah kapasitas resource seperti jumlah CPU dan memory pada satu server. Sebaliknya, pada teknik scale-down kita melakukan hal kebalikan dari metode scale-up yaitu kita mengurangi jumlah resource CPU atau memory pada server.
Sedangkan, pada teknik scale-out kita melakukan proses scaling secara horizontal yaitu dengan menambah jumlah server dengan spesifikasi yang sama sehingga terbentuk satu group of servers (cluster) yang bekerja secara paralel. Sebaliknya, pada teknik scale-in kita melakukannya dengan menghapus atau memutus koneksi satu atau lebih server dari cluster tadi.
Oke, jadi sudah lumayan paham ya perbedaannya. Sekarang kita balik lagi ke Redis 😀
Berdasarkan artikel yang saya rujuk di sini, Redis menggunakan teknik scaling secara horizontal/scale-out yang biasa dikenal dengan istilah Sharding.
Penjelasan mudahnya, pada teknik sharding kita membagi kumpulan key-value dari satu server Redis atau biasa disebut node kemudian mendistribusikan masing-masing key-value tersebut ke berapa node berbeda dalam satu cluster.
Bagaimana mengetahui posisi key berada di dalam cluster?
Redis memiliki algoritma khusus dalam menentukan posisi key berada. Algoritma tersebut menggunakan pendekatan Hash Slot di mana jumlah slotnya selalu konstan yaitu berjumlah 16384. Selain itu perlu diketahui juga dalam satu node Redis bisa memiliki banyak hash slot dan satu hash slot memiliki banyak key.
Untuk mengetahui posisi key berada di hash slot mana kita cukup menghitung nilai CRC16 dari key dan di-modulo-kan dengan jumlah hash slot (16384).
hash slot = CRC16(key) mod 16384
Misalkan kita menggunakan Redis cluster seperti ilustrasi di atas dan kemudian kita memiliki key = “foo”. Maka untuk mengetahui posisi key berada di hash slot mana kita dapat menghitungnya sebagai berikut:
crc16Hash = CRC16(“foo”) = 44950
hashSlot = crc16Hash mod 16384 = 44950 mod 16384 = 12182
Maka sesuai rentang pada masing-masing node, key “foo” berada pada primary node ke-3🎉.
Penutup
Oke, mungkin cukup segini dulu ya pembahasannya, jika ada kesalahan pada penjelasan saya di atas mohon bantuan koreksinya ya gaes🤭
Thankyou~
Discover more from Coursity
Subscribe to get the latest posts sent to your email.