【golang】golang redis 的使用

前端之家收集整理的这篇文章主要介绍了【golang】golang redis 的使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

前言

Redis 是一个开源的、使用C语言编写的、基于内存也可持久化的 Key-Value 数据库

Redis 优势

  • 性能高 – Redis 读速度 110000 次/s,写速度 81000次/s 。
  • 支持的数据类型多 – Redis支持 Strings,Lists,Hashes,Sets 及 Ordered Sets 数据类型。
  • 原子 – 所有操作都是原子性的,还支持对几个操作全并后的原子性执行。
  • 丰富的特性 – 还支持 publish/subscribe,通知,key 过期等等特性。

其他 key-value 存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。


引入包

"github.com/mediocregopher/radix.v2/pool"
"github.com/mediocregopher/radix.v2/redis"


序列化反序列化

import (
       "bytes"

       "github.com/ugorji/go/codec"
)

func MsgPackMarshal(v interface{}) ([]byte,error) {
       var buf = new(bytes.Buffer)
       enc := codec.NewEncoder(buf,new(codec.MsgpackHandle))
       err := enc.Encode(v)
       return buf.Bytes(),err
}
func MsgPackUnMarshal(data []byte,v interface{}) error {
       var buf = bytes.NewBuffer(data)
       dec := codec.NewDecoder(buf,new(codec.MsgpackHandle))
       return dec.Decode(v)
}


建立连接池

var redisConnectionPool *pool.Pool

df := func(network,addr string) (*redis.Client,error) {
      client,err := redis.Dial(network,addr)
      if err != nil {
            return nil,err
      }
      if config.RedisPassword != "" {
               if err = client.Cmd("AUTH",config.RedisPassword).Err; err != nil {
                     client.Close()
                     return nil,err
               }
      }
      return client,nil
}
redisConnectionPool,err = pool.NewCustom("tcp",config.RedisAddress,config.RedisConnectionNumber,df)
       if err != nil {
              panic("Failed to connect to Redis server: " + err.Error())
       }
}

关闭连接池

func Close() {
       redisConnectionPool.Empty()
}

使用客户端

func GetClient() (*redis.Client,error) {
       return redisConnectionPool.Get()
}

func PutClient(c *redis.Client) {
       redisConnectionPool.Put(c)
}

添加 key

func Set(table RedisDatabase,key string,value interface{}) (err error) {
       c,err := GetClient()
       if err != nil {
              return err
       }
       defer PutClient(c)

       encodedValue,err := MsgPackMarshal(value)
       if err != nil {
              return err
       }
       // Use table.String() + key as Redis key
       return c.Cmd("set",table.String()+key,string(encodedValue)).Err
}

查询 key

func Get(table RedisDatabase,unmarshal func([]byte) (interface{},error)) (value interface{},err error) {
       c,err := GetClient()
       if err != nil {
              return  }
       defer PutClient(c)

       // Use table.String() + key as Redis key
       encodedValue,err := c.Cmd("get",table.String()+key).Bytes()
       if err != nil {
              return  }
       return unmarshal(encodedValue)
}

删除 key

func Remove(table RedisDatabase,key string) (err error) {
       c,err := GetClient()
       if err != nil {
              return err
       }
       defer PutClient(c)

       // Use table.String() + key as Redis key
       return c.Cmd("del",table.String()+key).Err
}

猜你在找的Go相关文章