Golang 如何使用redigo將一個結構體數據保存到redis

Golang 如何使用redigo將一個結構體數據保存到redis

  1. 先序列化,再保存到redis中
  2. 從redis中獲得值是,先使用redis.Bytes(c.Receive())獲取到[]byte,再Unmarshal即可
    package main

    import (
        "encoding/json"
        "fmt"
        "time"

        "github.com/garyburd/redigo/redis"
    )

    var redisConc *RedisConnc

    // User ...
    type User struct {
        Name string `json:"user"`
        Age  int    `json:"age"`
    }

    // RedisConnc ...
    type RedisConnc struct {
        pool *redis.Pool
    }

    func main() {
        var err error
        InitRedis("127.0.0.1:6379", "")
        c := redisConc.pool.Get()
        user := User{
            Name: "test-name",
            Age:  18,
        }
        defer c.Close()
        // 1.直接將 user set,再Unmarshal爲結構體時會失敗
        // c.Send("SET", "user", user)
        // 2. 應該先 使用Marshal序列化
        var ub []byte
        ub, err = json.Marshal(user)
        if err != nil {
            fmt.Printf("%s\n", err.Error())
        }
        c.Send("SET", "user", ub)
        c.Flush()
        v, err := c.Receive()
        if err != nil {
            fmt.Printf("%s\n", err.Error())
        }
        fmt.Printf("%#v\n", v)
        c.Send("GET", "user")
        c.Flush()
        var vb []byte
        vb, err = redis.Bytes(c.Receive())
        if err != nil {
            fmt.Printf("%s\n", err.Error())
        }
        fmt.Printf("%#v\n", vb)
        u := new(User)
        // 直接將 user set,再Unmarshal爲結構體時會失敗
        err = json.Unmarshal(vb, &u)
        if err != nil {
            fmt.Printf("%s\n", err.Error())
        }
        fmt.Printf("%#v\n", u)
    }

    // InitRedis ...
    func InitRedis(host string, passwd string) error {
        var pool = &redis.Pool{
            MaxIdle:     50,
            MaxActive:   100,
            IdleTimeout: 240 * time.Second,
            Dial: func() (redis.Conn, error) {

                c, err := redis.Dial("tcp", host)
                if err != nil {
                    return nil, err
                }
                if passwd != "" {
                    if _, err := c.Do("AUTH", passwd); err != nil {
                        c.Close()
                        return nil, err
                    }
                }
                return c, err
            },
            // custom connection test method
            TestOnBorrow: func(c redis.Conn, t time.Time) error {
                if _, err := c.Do("PING"); err != nil {
                    return err
                }
                return nil
            },
        }
        redisConc = &RedisConnc{pool}
        return nil
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章