go: 连接redis(有2个库包:redigo和go-redis)

694 阅读4分钟

0/参考网址

blog.csdn.net/m0_56137272…

blog.csdn.net/weixin_4371…

0/前言

go语言有很多关于redis的库包,都能实现对redis的操作。例如redigo库包、go-redis库包。
本文将详细的介绍这2种库包

1/redigo库包

"github.com/garyburd/redigo/redis"
优点:redigo包装较为精练,一个Do方法涵盖CRUD,
缺点:包本身不支持连接redis集群;

<1>连接redis服务器

package main
 
import (
    "fmt"
    "github.com/garyburd/redigo/redis"
)
 
func main() {
    // redis通过Dial()函数来创建客户端
    redis_client, err := redis.Dial("tcp", "localhost:6379")
    if err != nil {
        fmt.Println("redis connect failed,", err)
        return
    } 
 
    fmt.Println("redis connect success")
 
    defer redis_client.Close()
}

<2>set和get操作

set:设置

    // redis通过Do()函数来进行操作
    // 第一个代表操作,这里是"Set", 代表是要设置k-v
    // 第二个是key
    // 第三个是value
    _, err = redis_client.Do("Set", "abc", 100)
    if err != nil {
        fmt.Println("set string failed", err)
        return
    }
    _, err = redis_client.Do("Set", "36D", "good")
    if err != nil {
        fmt.Println("set string failed", err)
        return
    }

get:读取

    // redigo库包通过redis.Int()函数来获取整型
    result1, err := redis.Int(redis_client.Do("Get", "abc"))
    if err != nil {
        fmt.Println("get string failed,", err)
        return
    }
    fmt.Println(result1)
    
    // redigo 通过redis.String()函数来获取字符串
    result2, err := redis.String(redis_client.Do("Get", "36D"))
    if err != nil {
        fmt.Println("get string failed,", err)
        return
    }
    fmt.Println(result2)
    
    // 批量获取
    // "MGet"就是批量获取
    res3, err := redis.Strings(redis_client.Do("MGet", "36", "32"))
    if err != nil {
        fmt.Println("get string failed,", err)
        return
    }
    fmt.Println(res3)

设置过期时间

// 设置过期时间
// 可以灵活的这是某个key的过期时间
// 这里用的是"setex",给"a"这个key设置的过期时间是10秒
_, err = client.Do("setex" , "a", 2, "10")
if err != nil {
    fmt.Println("set string failed", err)
    return
}

res2, err := redis.String(client.Do("Get", "a"))
if err != nil {
    fmt.Println("get string failed,", err)
    return
}
fmt.Println(res2)
time.Sleep(5 * time.Second)
fmt.Println("5秒后")
res2, err = redis.String(client.Do("Get", "a"))
if err != nil {
    fmt.Println("get string failed,", err)
    return
}
fmt.Println(res2)

// 结果
//10
//5秒后
get string failed, redigo: nil returned

list操作

lpush key element1 element2:向列表左侧插入若干个元素

    // 从左边放入元素
    _, err = client.Do("lpush", "NBAplayer", "Jordon", "Kobe", "Lebron")
    if err != nil {
        fmt.Println("push element failed")
        return
    }

lrange key start end:返回范围内的所有元素

    // 取出所有元素
    res4, err := redis.Strings(client.Do("lrange", "NBAplayer", "0", "-1"))
    if err != nil {
        fmt.Println("get element failed")
        return
    }
    for _, v := range res4{
        fmt.Println(v)
    }
输出结果:
Lebron
Kobe
Jordon

hash表

hset key field value:添加或修改hash类型key的field的值

// 单个插入
    _, err = client.Do("HSet", "DSB", "name", "SB")
    if err != nil {
        fmt.Println("hset failed")
        return
    }

hmset key field1 value1 field2 value2:批量添加多个hash类型key的field值

    _, err = client.Do("HmSet", "DSB", "age", "18", "addr", "usa")
   if err != nil {
       fmt.Println("hmset failed")
       return
   }

hget key field:获取一个hash类型的key的field的值

   // 单个获取
  res5, err := redis.String(client.Do("Hget", "DSB", "name"))
  if err != nil {
      fmt.Println("hget element failed")
      return
  }
  fmt.Println(res5)

hmget key field1 field2:批量获取hash类型key多个field的value值

    // 批量获取
  res6, err := redis.Strings(client.Do("HmGet", "DSB", "name", "age", "addr"))
  if err != nil {
      fmt.Println("hmget failed")
      return
  }
  fmt.Println(res6)

连接池

// 创建redis连接池
var pool *redis.Pool

func init() {
   pool = &redis.Pool{
   	MaxIdle:     16,  // 连接数量
   	MaxActive:   0,   // 最大连接数量,不确定用0
   	IdleTimeout: 300, //连接关闭时间
   	Dial: func() (redis.Conn, error) { //需要连接的数据库
   		return redis.Dial("tcp", "localhost:6379")
   	},
   }
}
func main() {
   // 从连接池中获取连接
   client := pool.Get()
   // 把连接放回连接池
   defer client.Close()
   _, err := client.Do("Set", "CSDN", "good")
   if err != nil {
   	fmt.Println("set string failed, err:", err)
   	return
   }

   res, err := redis.String(client.Do("Get", "CSDN"))
   if err != nil {
   	fmt.Println("set string failed, err:", err)
   	return
   }
   fmt.Println(res)
   // 关闭连接池
   pool.Close()
}

2/go-redis库包

go-redis包装程度高,方法多,支持redis集群;

<1>连接redis服务器

package main
 
import (
	"fmt"
	"github.com/go-redis/redis"
)

// 先声明一个redis数据库的客户端,redis也可以理解为是一个数据库db
var rdb *redis.Client
 
func initRedisClient() (err error) {
    rdb_client = redis.NewClient(&redis.Options{
            Addr:     "localhost:6379",
            Password: "",
            DB:       0,},
          )
    // ping一下,看能不能ping通
    _, err = rdb_client.Ping().Result()

    if err != nil {
         return err
    }
    return nil
}

<2>set和get的操作

// set操作
err = rdb_client.Set("goland", "so good", 0).Err()
    if err != nil {
        fmt.Println(err)
        return
    }


// Get
res, err := rdb_client.Get("goland").Result()
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(res)


//批量设置
err = rdb_client.MSet("Go", "NO1", "C++", "NO1", "JAVA", "NO1", "PYTHON", "NO1").Err()
if err != nil {
    fmt.Println("MSet failed, err: ", err)
    return
}

//批量获取
res1, err := rdb.MGet("Go", "C++", "JAVA", "PYTHON").Result()
if err != nil {
        fmt.Println(err)
        return
}
for i, _ := range res1 {
      fmt.Println(res1[i])
}

哨兵模式

func initClient()(err error){
	rdb := redis.NewFailoverClient(&redis.FailoverOptions{
		MasterName:    "master",
		SentinelAddrs: []string{"x.x.x.x:26379", "xx.xx.xx.xx:26379", "xxx.xxx.xxx.xxx:26379"},
	})
	_, err = rdb.Ping().Result()
	if err != nil {
		return err
	}
	return nil
}

集群

func initClient()(err error){
	rdb := redis.NewClusterClient(&redis.ClusterOptions{
		Addrs: []string{":7000", ":7001", ":7002", ":7003", ":7004", ":7005"},
	})
	_, err = rdb.Ping().Result()
	if err != nil {
		return err
	}
	return nil
}

总结

本文仅仅简单介绍了如何使用go语言操作redis,
分别展示了两种客户端包如何实现对redis的访问和操作,并展示了redis的部分指令,
而redis提供的指令远不止这些。
写博客的过程中,个人还是感觉redigo使用起来更加易懂,而go-redis支持连接哨兵和集群模式的redis,还是要根据情况选择使用。