Golangはredigoを使用して構造体データをredisに保存する方法

2898 ワード

Golangはredigoを使用して構造体データをredisに保存する方法
  • はまずシーケンス化され、redisに
  • 保存される.
  • 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
    ", err.Error()) } c.Send("SET", "user", ub) c.Flush() v, err := c.Receive() if err != nil { fmt.Printf("%s
    ", err.Error()) } fmt.Printf("%#v
    ", v) c.Send("GET", "user") c.Flush() var vb []byte vb, err = redis.Bytes(c.Receive()) if err != nil { fmt.Printf("%s
    ", err.Error()) } fmt.Printf("%#v
    ", vb) u := new(User) //  user set, Unmarshal err = json.Unmarshal(vb, &u) if err != nil { fmt.Printf("%s
    ", err.Error()) } fmt.Printf("%#v
    ", 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 }