在编程的时候,连接数据库进行存储操作是必不可少的,这里我们去连接redis数据库

第三方开源库

go get -v github.com/garyburd/redigo/redis

这种第三方的包没有像是之前那种的文档可以查看,不过我们可以通过idea查看

随便输入下包名加点

package main

import (
	"github.com/garyburd/redigo/redis"
)

func main(){
	redis.
}

 我们上面输入了一个redis. 然后在idea中把鼠标放在这个名字上,会有以下信息

翻译信息

包redis是redis数据库的客户端。

Redigo常见问题解答(https://github.com/garyburd/redigo/wiki/FAQ)包含有关此软件包的更多文档。

连接

Conn接口是使用Redis的主要接口。应用程序通过调用Dial、DialWithTimeout或NewConn函数来创建连接。将来,将添加用于创建分片连接和其他类型连接的功能。

当应用程序完成连接时,应用程序必须调用connection Close方法。

通过上述信息我们得知Dial、DialWithTimeout或NewConn函数来创建连接

 一、如何查询第三方包函数

package main

import (
	"github.com/garyburd/redigo/redis"
)

func main(){
	redis.Dial()
}

我们直接去调用Dial函数,再次查看说明信息

翻译

拨号连接到Redis服务器在给定的网络和地址使用指定的选项

说明这里的Dial和我们之前的tcp类似都是建立连接使用的,补全案例

package main

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
)

func main(){
	conn , err := redis.Dial("tcp","101.43.4.210:6379")
	if err != nil{
		fmt.Println(err)
		return
	}

	fmt.Println(conn)
}

上面我们看到了返回值是conn,相当于我们已经连接上了redis

那么我们就可以对redis做一些操作了,先将鼠标放在conn上查看接口下的方法

 

翻译

Do向服务器发送命令并返回收到的回复

如上翻译得知,Do是用来与已经连接的redis服务器进行命令交互的

而redis数据库基本上都是直接使用命令进行存储的,这样我们就能做很多事情

 二、redis数据库连接认证

从go去连接redis,如果redis里面带有认证信息,那么我们go也要带认证

package main

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
)

func main(){
	c , err := redis.Dial("tcp","101.43.4.210:6379")
	if err != nil{
		fmt.Println(err)
	}

	defer c.Close()

	if _, err := c.Do("AUTH", "123456"); err != nil {
		c.Close()
	}


}

和正常连接redis一样,直接auth 加密码就可以认证redis

三、redis写入并查看数据

1、简单写入数据

和上面一致,通过Do方法即可

package main

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
)

func main(){
	c , err := redis.Dial("tcp","101.43.4.210:6379")
	if err != nil{
		fmt.Println(err)
	}

	defer c.Close()

	if _, err := c.Do("AUTH", "123456"); err != nil {
		c.Close()
	}


	_,err = c.Do("Set","key1",998)   //redis写入数据
	if err != nil{
		fmt.Println(err)
	}


	r ,err := redis.Int(c.Do("Get","key1"))  //类型断言接口
	if err != nil{
		fmt.Println(err)
	}
	fmt.Println(r)
}

 2、redis hash操作

package main

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
)

func main(){
	c , err := redis.Dial("tcp","101.43.4.210:6379")
	if err != nil{
		fmt.Println(err)
	}

	defer c.Close()

	if _, err := c.Do("AUTH", "123456"); err != nil {
		c.Close()
	}

	//修改为HSet 定义Hash值
	_,err = c.Do("HSet","user01","name","john")
	if err != nil{
		fmt.Println(err)
	}

    //定义年龄
	_,err = c.Do("HSet","user01","age",18)
	if err != nil{
		fmt.Println(err)
	}


    //名称 字符串
	r1 ,err := redis.String(c.Do("HGet","user01","name"))
	if err != nil{
		fmt.Println(err)
	}
	fmt.Println(r1)

    //年龄是int
	r2 ,err := redis.Int(c.Do("HGet","user01","age"))
	if err != nil{
		fmt.Println(err)
	}
	fmt.Println(r2)
}

 3、批量写入或读取多个数据

package main

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
)

func main(){
	c , err := redis.Dial("tcp","101.43.4.210:6379")
	if err != nil{
		fmt.Println(err)
	}

	defer c.Close()

	if _, err := c.Do("AUTH", "123456"); err != nil {
		c.Close()
	}

	//修改为HMSet
	_,err = c.Do("HMSet","user02","name","john","age",18)
	if err != nil{
		fmt.Println(err)
	}



	//redis.String 表示为一个组,用于接收多个数据,形式是一个切片
	r ,err := redis.Strings(c.Do("HMGet","user02","name","age"))
	if err != nil{
		fmt.Println(err)
	}

	//上面返回的是一个集合,类似于切片,我们通过for-range去遍历切片
	for i , v := range r{
		fmt.Printf("r[%d]=%s\n",i,v)
	}

}

四、redis 连接池

通过golang对redis的操作,还可以通过redis链接池,流程如下

1、实现初始化一定数量的链接,放入链接池  
2、当go需要操作redis时,直接从redis连接池取出链接
3、这样可以节省临时获取redis链接的时间,从而提高效率

核心代码

var pool *redis.Pool
pool = &redis.Pool{
  Maxldle: 8      //最大空闲链接数量
  MaxActive: 0    //表示和数据库最大链接数,0表示,并发不限制数量
  ldleTimeout: 100  //最大空闲时间,用完链接后100秒后就回收到链接池
  Dial: func()(redis.Conn,error){ //初始化链接池的代码
    return redis.Dial("tcp","101.43.4.210:6379)
  },
}

c := pool.Get()  //从连接池中取出一个链接,关闭后会回收
pool.Close()  //关闭连接池,一旦关闭连接池,就无法再从池里再取链接

案例

package main

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
)

//定义一个全局的pool
var pool *redis.Pool

//当程序启动的时候,就初始化链接池
func init(){
	pool = &redis.Pool{
		MaxIdle: 8,
		MaxActive: 0,
		IdleTimeout: 100,
		Dial: func()(redis.Conn,error){
			return redis.Dial("tcp","101.43.4.210:6379")
		},
	}
}



func main(){

	conn := pool.Get()  //先从pool 取出一个链接
	defer conn.Close()   //关闭这个链接,用完了就不要占着位置


	//添加一个认证
	if _, err := conn.Do("AUTH", "123456"); err != nil {
		conn.Close()
	}

	_, err := conn.Do("Set","name","tom")
	if err != nil{
		fmt.Println("conn.Do err=",err)
		return
	}

	//取数据
	r , err := redis.String(conn.Do("Get","name"))
	if err != nil{
		fmt.Println("conn.Do err=",err)
		return
	}
	fmt.Println("r=",r)

}

说明

如果我们要从pool取出链接,一定要保证连接池是没有关闭的  poll.Close() 关闭连接池

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐