在编程的时候,连接数据库进行存储操作是必不可少的,这里我们去连接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]=%sn",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() 关闭连接池