在编程的时候,连接数据库进行存储操作是必不可少的,这里我们去连接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数据库基本上都是直接使用命令进行存储的,这样我们就能做很多事情
从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
和上面一致,通过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)
}
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)
}
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)
}
}
通过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() 关闭连接池