Berkenalan dengan Redis dan Golang — Part I

Part I — Golang Redis

Redha Juanda
Redha Juanda
4 min readApr 20, 2020

--

Redis adalah salah satu key-value database dari keluarga NoSQL. Jika RDBMS dan NoSQL pada umumnya menyimpan datanya di hardisk, Redis menyimpannya di dalam memory (RAM) karena sistemnya adalah in-memory database, sehingga membuat kecepatan mengakses datanya menjadi sangat cepat.

Di post ini kita akan membahas tentang bagaimana cara menggunakan Redis dengan Go. Post ini mengasumsikan bahwa Anda telah menginstall redis di komputer Anda. Jika belum silahkan install terlebih dahulu.

Memilih Redis Client

Pertama kita harus meginstall go client untuk redis. Kita bisa melihat daftar go client untuk redis di official websitenya: https://redis.io/clients#go.
Di daftar tersebut juga kita bisa melihat client yang direkomendasikan oleh redis, yaitu Radix dan Redigo.

Di post ini, kita akan menggunakan Redigo dikarenakan API Redigo yang simpel dan sangat mudah untuk dipelajari. Kita bisa melihat semua referensi API nya disini: https://godoc.org/github.com/garyburd/redigo/redis

Install Redigo

Install redigo menggunakan commandgo get

Implementasi

Misalkan kita memiliki suatu object mahasiswa yang ingin kita store ke redis, dengan atribute: nama, nim, ipk, dan semester.

Sebenarnya ada banyak cara untuk menyimpan data di redis, namun supaya pembahasan kita tidak melebar, kita akan menggunakan salah satu tipe data yang terdapat di redis yaitu hash . Hash sangat cocok untuk merepresentasikan objek karena hash adalah map dengan field string dan value string.

Untuk menyimpan data dengan tipe data hash di redis kita bisa menggunakan command HSET. Silahkan lihat dokumentasi redis tentang HSET https://redis.io/commands/hset

Disini kita menyimpan sebuah object mahasiswa dengan id: 1 diikuti dengan semua data yang terdapat pada mahasiswa.

Untuk melakukan hal yang sama pada aplikasi Golang kita, terdapat 2 step:

  • Pertama kita harus membuat koneksi ke server redis dengan memanggil functionDial() yang terdapat di redigo
  • Setelah membuat koneksi, untuk mengeksekusi command redis kita menggunakan method Do() yang terdapat pada instance koneksi.

Berikut contohnya:

Nah, coba jalankan dan kita telah berhasil menyimpan data mahasiswa di redis. Sekarang kita bisa masuk ke redis-cli dan menampilkan data yang baru saja kita masukkan dengan command:

Command tersebut akan menampilkan nama dari mahasiswa dengan id 1

Untuk melakukan hal yang sama di Go, kita tinggal memanggil lagi method Do() dan mengganti argumennya menjadi HGET.

Namun, terdapat masalah ketika kita mengakses reply kembalian dari method Do() karena method tersebut ternyata mengembalikan nilai dengan tipe data interface{}

Beruntungnya redigo menyediakan beberapa function yang dinamakan reply helper untuk mengubah reply dengan tipe data interface{} tadi ke tipe data yang spesifik, Beberapa function yang disupport antara lain Bool, Int, Bytes, String, Strings dan Values . Contoh penggunaannya seperti berikut:

Nah, dengan menggunakan HGET, tentu saja kita bisa mengambil satu-satu field yang terdapat dalam objek kita, lalu bagaimana caranya untuk mengambil semua data dalam objek mahasiswa:1 sekaligus? Jawabannya adalah menggunakan command HGETALL .

Coba jalankan, maka kita akan mendapatkan semua datanya dengan tipe data map[string]string

Lalu bagaimana kalau kita ingin menyimpan data reply tersebut ke struct? Walaupun kita bisa membuat function sendiri dan menginisialisasi structnya secara manual, redigo telah menyediakan alternatif yang lebih baik, yaitu menggunakan function ScanStruct()

Pertama mari kita definisikan struct Mahasiswa terlebih dahulu, kita juga mendefinisikan tag redis yang berisi sesuai dengan field yang terdapat di redis.

Lalu perhatikan contoh code berikut:

Disini ScanStruct akan mempopulate semua data reply ke struct Mahasiswa, ScanStruct juga akan otomatis men-casting tipe datanya sesuai dengan yang didefinisikan di struct Mahasiswa, sangat mudah bukan?

Connection Pooling

Salah satu hal penting tentang redigo yang harus diketahui adalah bahwa Conn yang kita gunakan selama ini tidak aman untuk concurrency. Untuk selengkapnya silahkan lihat: https://godoc.org/github.com/gomodule/redigo/redis#hdr-Concurrency

Jika kita ingin menggunakan koneksi redis secara concurrent, seperti pada aplikasi web, maka kita harus menggunakan pool object. Pool akan menampung beberapa koneksi redis, dan ketika kita ingin menggunakan, kita akan mengambil salah satu koneksi dari pool, ketika selesai kita akan mengembalikan koneksi yang sudah tidak dipakai kembali ke pool. Berikut contoh membuat pool koneksi di redigo:

Kita juga bisa mengeset pool.MaxActive sebanyak yang kita butuhkan, MaxActive adalah jumlah maksimal koneksi yang bisa ditampung oleh pool dalam satu waktu, jika MaxActive nya 0, maka tidak ada batasan maksimal koneksi yang bisa ditampung.

Setelah kita mengenal redis, di post selanjutnya kita akan mencoba melihat konsep penggunaan redis untuk server side caching.

Sampai jumpa di post berikutnya 👾

Next : Menggunakan Redis untuk Server Side Caching — Part II

--

--