您的位置:首页 > 数据库 > Redis

golang 调用redis

2016-09-14 16:46 561 查看
用的是github.com/garyburd/redigo/redis这个库

Connection

可以用三种方法创建连接:Dial 、 DialWithTimeout 和 NewConn

比如:

c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil{
fmt.Println(err)
return
}
fmt.Println("Success to Connect redis!")
defer c.Close()

打开了连接要在程序完成后调用Close关闭掉

Connection interface拥有Do方法执行redis命令:

Do(commandName string, args ...interface{}) (reply interface{}, err error)

比如:

n, err := conn.Do("APPEND", "key", "value")


Pipelining

可以利用以下方法进行Pipelining:

Send(commandName string, args ...interface{}) error   发送命令
Flush() error                                         冲洗Connection的output缓冲区到server
Receive() (reply interface{}, err error)	      从服务器读一个reply

比如:

c.Send("set","wwk1",12)
c.Send("set","wwk2","oop")
c.Send("set","wwk3","fuck")
c.Send("get","xu")
c.Flush()
c.Receive()
//reply from set
c.Receive()              //reply from set
c.Receive()              //reply from set

v,err := redis.String(c.Receive())   //reply from get
println(v)

Do方法结合了Send、Flush和Receive,如果Do发送的命令为空,则会冲洗connection的output缓冲区,并接收reply

Publish and Subscribe

利用Send 、Flush和Receive实现的 Pub/Sub subscribers

c.Send("SUBSCRIBE", "example")
c.Flush()
for {
reply, err := c.Receive()
if err != nil {
return err
}
// process pushed message
}

还可以利用PubSubConn,它封装了一些方便的方法去实现subscribers

psc := redis.PubSubConn{c}
psc.Subscribe("redischat")
for {
switch v := psc.Receive().(type) {
case redis.Message:		//有消息Publish到指定Channel时
fmt.Printf("%s: message: %s\n", v.Channel, v.Data)
case redis.Subscription:	//Subscribe一个Channel时
fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)
case error:
return v
}
}

Publish的例子:
go subscribe()
for{
var s string
fmt.Scanln(&s)
_,err := c.Do("publish","redischat",s)
if err != nil{
fmt.Println("pub err")
return
}
}

获取一个字符串:

d, err := redis.String(c.Do("get","xu"))
if err != nil{
fmt.Println(err)
return
}

获取一个循环:

c.Do("lpush","redlist","qqq")
c.Do("lpush","redlist","fff")
c.Do("rpush","redlist","kkk")
values, _ := redis.Values(c.Do("lrange","redlist","0","100"))
for _,v := range values{
fmt.Println(string(v.([]byte)))
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: