【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, key string, 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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值