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 }