Bahas Tipis Seputar Redis
Tags: backend, webdev, redis, tutorial
Published: 2024-06-06 10:37:52

### Intro
Yo! Ini tulisan pertama saya di komunitas ini. Saya akan coba untuk membahas seputar Redis dengan format Question and Answer (QnA) ya. Selamat membaca!😁

### 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.


![key-value](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w6veohugwvjq4gcudh9a.png)

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:

![Redis sebagai cache](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xuxuc7u9z1g7izks9whh.png)

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](https://redis.io/learn/operate/redis-at-scale/persistence-and-durability/persistence-options-in-redis).

#### 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 :D 

Berdasarkan artikel yang saya rujuk di [sini](https://redisson.org/glossary/sharding.html), Redis menggunakan teknik scaling secara horizontal/scale-out yang biasa dikenal dengan istilah Sharding. 


![Redis cluster](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/32wq44xlgc872ntnxnn3.png)

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 beberapa node berbeda dalam satu cluster.

#### Bagaimana mengetahui posisi key berada di dalam node keberapa di cluster?
Redis memiliki algoritma khusus dalam menentukan posisi key berada. Algoritma tersebut menggunakan pendekatan [Hash Slot](https://redis.io/learn/operate/redis-at-scale/scalability/clustering-in-redis) 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~