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
    }
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CoLiuRs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值