go 使用redis
go操作redis, 拥有很多第三方包, 官方推荐使用radix 和redigo
这里选用redigo
注意redigo已经迁移
打开githup :https://github.com/garyburd/redigo
提示如下:
项目已经迁移到了https://github.com/gomodule/redigo
因此, 我们使用最新的gomodule下的版本,不使用原来的grayburd的版本, 目前国内环境很多能搜索到的资料都还是grayburd版本,其实使用差别不大, 但最好使用最新版本
获取第三方包:
go get github.com/gomodule/redigo/redis
备注: redigo基本都是通过Do发送命令的方式进行实现, 因此要求对redis的命令有一定的了解, 另外也提供Do的超时函数DoWithTimeout
入门程序:
通过入门程序进行介绍, 这样对于redigo首先一个直观的体验:
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
"log"
)
func main() {
c1, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
log.Fatalln(err)
}
defer c1.Close()
c2, err := redis.DialURL("redis://127.0.0.1:6379")
if err != nil {
log.Fatalln(err)
}
defer c2.Close()
rec1, err := c1.Do("Get", "name")
if rec1 != nil{
fmt.Printf("--------- ")
fmt.Println(rec1)
}
c2.Send("Get", "name")
c2.Flush()
rec2, err := c2.Receive()
if rec2 != nil{
fmt.Printf("--------- ")
fmt.Println(string(rec2.([]byte)))
}
resset, err := redis.String(c1.Do("SET", "my_test", "redigo"))
if err != nil {
fmt.Println("set err")
} else {
fmt.Println(resset)
}
//获取value并转成字符串
account_balance, err := redis.String(c1.Do("GET", "my_test"))
if err != nil {
fmt.Println("err while getting:", err)
} else {
fmt.Println(account_balance)
}
//对已有key设置5s过期时间
n, err := redis.Int64(c1.Do("Expire", "my_test", 5))
if err != nil {
fmt.Println(n)
} else if n != int64(1) {
fmt.Println("failed")
}
n2, err := redis.Int64(c2.Do("TTL", "my_test"))
if err != nil {
fmt.Println(n2)
} else if n != int64(1) {
fmt.Print(err)
fmt.Println("failed")
}
//删除key
res2, err := c1.Do("DEL", "my_test")
if err != nil {
fmt.Print(err)
fmt.Println("del err")
} else {
fmt.Println(res2)
}
}
输出:
OK
redigo
1
执行命令
redis使用redis主要使用DO函数直接发送命令执行, 因此需要堆redis的命令有一定的了解
定义如下:
Do(commandName string, args ...interface{}) (reply interface{}, err error)
commandName 为命令字符串
args 为参数,可以是任意类型, 当然需要时正确的, 否则在执行时会返回失败
返回内容:
reply 为任意类型的参数, err为错误信息
例如: n, err := conn.Do("APPEND", "key", "value")