Redis Hash dengan Go Menggunakan HSET, HGET dan HGETALL

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.

redis  go 

See also