今天在这里就简单的说一下golang中操作redis数据库
在这里需要用到golang中优秀的第三方包
开源库redigo的使用
github地址:
https://github.com/garyburd/redigo
获取的redigo包的命令(一般通过git来操作)
go get github.com/garyburd/redigo
链接redis
package main
import(
"github.com/garyburd/redigo/redis"
)
func main(){
//链接redis
redisConn,err :=redis.Dial("tcp","127.0.0.1:6379")
if err != nil{
fmt.Println("连接失败:",err)
return
}
defer redisConn.Close()
}
在这里tcp可以是"tcp4"、"tcp6"、"tcp"中的任意一个,分别表示TCP(IPv4-only),TCP(IPv6-only)或者TCP(IPv4,IPv6的任意一个)。127.0.0.1:6379是端口号,redis默认为6379.redis.Dial()返回的是一个redis.conn的指针.
读写
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
redisConn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("连接失败:", err)
return
}
defer redisConn.Close()
_, err = redisConn.Do("SET", "mykey", "hello,world")
if err != nil {
fmt.Println("redis set failed:", err)
}
data, err := redis.String(c.Do("GET", "mykey"))
if err != nil {
fmt.Println("redis get failed:", err)
} else {
fmt.Println("Get mykey:", data)
}
}
输出:hello,world
在c.Do()函数里写入对应的redis操作指令就可以执行该指令。第21行加了一个redis.String()函数是因为执行get命令时返回的是一个[]uint8类型的数据,可以把他转化为string类型.
如果想设置过期时间,可以使用SET的附加参数:
_, err = redisConn.Do("SET", "mykey", "hello,world", "EX", "5")
if err != nil {
fmt.Println("redis set failed:", err)
}
第一行是让他存活5秒,然后会delete掉
检测值是否存在
EXISTS key
judge, err := redis.Bool(c.Do("EXISTS", "mykey1"))
if err != nil {
fmt.Println("error:", err)
} else {
fmt.Println("exists or not:", judge)
}
输出:exists or not: false
删除
_, err = redisConn.Do("DEL", "mykey")
if err != nil {
fmt.Println("redis delelte failed:", err)
}
会找到键名为key的删除掉,如果没有,返回一个错误
读写json到redis
package main
import (
"encoding/json"
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
redisConn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer redisConn.Close()
key := "user"
//创建集合
mymap := map[string]string{"userName": "hello", "passWord": "world"}
//通过json包把json数据封装
value, _ := json.Marshal(mymap)
n, err := redisConn.Do("SETNX", key, value)
if err != nil {
fmt.Println(err)
}
if n == int64(1) {
fmt.Println("success")
}
var mymapGet map[string]string
valueGet, err := redis.Bytes(c.Do("GET", key))
if err != nil {
fmt.Println(err)
}
//解封装
errShal := json.Unmarshal(valueGet, &mymapGet)
if errShal != nil {
fmt.Println(err)
}
fmt.Println(mymapGet["userName"])
fmt.Println(mymapGet["passWord"])
}
开源库go-redis/redis的使用
**github地址:
https://github.com/go-redis/redis
获取的go-redis/redis包的命令(一般通过git来操作)
go get github.com/go-redis/redis
链接redis
client := redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "", // no password set
DB: 0, // use default DB
})
第一行产生的是一个redis.client指针
第四行默认使用的是redis的第一个数据库,redis默认是有16个数据库下标0~15
读写
err = client.Set("name", "孟家恒", 0).Err()
if err != nil {
panic(err)
}
val, err := client.Get("name").Result()
if err != nil {
panic(err)
}
fmt.Println("name", val)
val2, err := client.Get("name").Result()
if err == redis.Nil {
fmt.Println("name does not exists")
} else if err != nil {
panic(err)
} else {
fmt.Println("key2", val2)
}
err = client.HSet("tmap", "1", "f1").Err()
if err != nil {
fmt.Printf("try hset map[tmap] field[1] error[%s]\n",err.Error())
}
kvMap := make(map[string]interface{})
kvMap["3"] = "f3"
kvMap["4"] = "f4"
err = client.HMSet("tmap", kvMap).Err()
if err != nil {
fmt.Printf("try mset map[tmap] field[3] field[4] error[%s]\n",err.Error())
}
go-redis包是把函数名定义成了redis操作指令的开头
例如:
第一行client.Set("name","孟家恒",0).Err(),就是设置key属性,
第20行就是设置哈希值
第一行的第三个参数是这个键存活的时间,默认0的话就是永久,如果想设置过期时间,如下第19行
package main
import (
"fmt"
"time"
"github.com/go-redis/redis"
)
func main() {
client := redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "", // no password set
DB: 0, // use default DB
})
pong, err := client.Ping().Result()
fmt.Println(pong, err)
err = client.Set("name", "孟家恒", time.Second*10).Err()
if err != nil {
panic(err)
}
}
注:如果想设置10秒不能直接写10,而应写time.Second*10