Hash adalah salah satu tipe data di Redis. Redis hash merupakan sebuah map yang berisi key-key dengan value nya masing-masing. Ini sangat berguna untuk menyimpan objek. Key dan value disimpan di hash dalam bentuk string, tapi sudah ada beberapa library client yang dapat langsung mengubah nya ke dalam tipe data lain. Pada artikel ini akan dijelaskan cara menggunakan tipe data hash di Redis.
Command-command yang akan digunakan adalah: HSET
, HGET
, dan HGETALL
. HSET
adalah command untuk menulis data pada key di hash. Apabila hash yang dituju sudah ada, data nya akan ditimpah dengan yang baru. Apabila hash nya belum ada, hash baru akan dibuat. HGET
adalah command untuk mengambil nilai dari sebuah key dari hash. HGETALL
adalah command untuk mengambil nilai dari semua key dari hash.
Library client yang digunakan adalah https://github.com/gomodule/redigo.
Set Hash di Redis
Seperti yang sudah dijelaskan di post sebelumnya, Kita mengeksekusi command menggunakan satu koneksi dari pool. Lalu koneksi tersebut dikembalikan ke pool setelah selesai digunakan. Untuk menyimpan hash ke Redis, code nya akan seperti ini:
...
key := "user_1"
expInSeconds := 1000
newUser := User{
Name: "my user name",
Age: 22,
}
conn := pool.Get()
defer conn.Close()
_, err := conn.Do("HSET", redis.Args{}.Add(key).AddFlat(newUser)...)
if err != nil {
return err
}
_, err = conn.Do("EXPIRE", key, expInSeconds)
if err != nil {
return err
}
...
Command HSET
dapat digunakan untuk menyimpan data ke beberapa key sekaligus. Dengan menggunakan library redigo, kita dapat menyimpan sebuah struct menjadi hash. Coba lihat contoh di atas, kita menggunakan redis.Args{}.Add(key).AddFlat(newUser)...
untuk menyimpan sebuah objek struct. Objek tersebut diubah menjadi key-value dengan fungsi AddFlat
, sehingga menjadi format yang dapat diterima oleh Redis. Redigo menggunakan tag redis
pada field dari struct sebagai key. Struct User
pada contoh diatas adalah seperti ini:
type User struct {
Name string `redis:"name"`
Age int `redis:"age"`
}
Kita mengeksekusi command EXPIRE
setelah HSET
. Ini untuk memberikan expire time pada hash yang di simpan. Sangat direkomendasikan untuk selalu memberikan expire time pada setiap data. Data tanpa expire time dapat membuat penuh memori Redis cepat atau lambat.
Get Hash dari Redis
HGET untuk mengambil data dari key
Kalau kita hanya perlu nilai dari satu key saja, kita dapat menggunakan command HGET
dengan parameter nama hash dan key. Command ini hanya akan mengambil nilai dari key tersebut.
conn := pool.Get()
defer conn.Close()
reply, err := redis.String(conn.Do("HGET", key, field))
if err != nil {
w.Write([]byte(err.Error()))
return
}
HGETALL to Get All Field Value
Untuk mengambil nilai dari seluruh key pada hash, kita menggunakan command HGETALL
. Redigo menyediakan fungsi ScanSctruct
untuk meng-convert hasil dari command menjadi struct yang kita buat.
values, err := redis.Values(conn.Do("HGETALL", key))
if err != nil {
w.Write([]byte(err.Error()))
return
}
p := user{}
redis.ScanStruct(values, &p)
ScanStruct menggunakan tag redis
pada struct untuk menemukan field yang sesuai. Kemudian mengeset value pada field tersebut. Oleh karena itu, kita perlu menggunakan pointer dari objek sebagai parameter nya.
Kesimpulan
Ada banyak cara untuk menserialisasikan objek untuk di simpan ke Redis. Salah satu nya adalah dengan menggunakan Redis Hash. Redis Hash sangat berguna untuk menyimpan map atau objek struct. Kita dapat membuat cache ke database dengan sangat mudah menggunakan ini. Selain itu masih banyak lagi kegunaan dari Redis Hash yang mungkin dapat bermanfaat bagi kita.