用go语言操作redis
用go语言操作redis
go语言使用redis需要去下载官方redis工具包
在go_path路径下执行: go get github.com/garyburd/redigo/redis
如果没安装git 你可以去后面那个链接下载一个zip包,然后解压到本地gopath路径下就可以了
gopath路径如果不知道就去看一下环境变量配置参数,一般都能看得到的
当然 也有关于redis的工具不止这一种,这里就不一一举例了,其实最重要的还是你对redis基础和命令的理解
**redis官方文档地址: http://redisdoc.com/string/index.html **
简单的例子
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func string() {
//通过go向redis 写入数据和读取数据
//1. 链接到go
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("reis connect err=", err)
return
}
defer conn.Close()
//2. 通过go向redis写入数据 string[key-val]
_, err = conn.Do("Set", "name", "tom猫")
if err != nil {
fmt.Printf("Set err=%v \n", err)
}
//3. 从redis读取数据
r, err := redis.String(conn.Do("Get", "name"))
if err != nil {
fmt.Println("get err=", err)
return
}
//name, ok := r.(string)
fmt.Println("name:", r)
}
func main() {
//其实都是操作命令 熟练使用redis的命令基本上就会了
//fixme redis 文档地址: http://redisdoc.com/string/index.html
//string()
//hash()
//list()
subscribe()
}
func subscribe() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println(err)
return
}
defer c.Close()
psc := redis.PubSubConn{c}
psc.Subscribe("redChatRoom")
for {
switch v := psc.Receive().(type) {
case redis.Message:
fmt.Printf("%s: message: %s\n", v.Channel, v.Data)
case redis.Subscription:
fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)
case error:
fmt.Println(v)
return
}
}
}
func list() {
//1.连接到redis数据库
conn,err :=redis.Dial("tcp","127.0.0.1:6379")
if err != nil{
fmt.Println("redis连接失败,错误信息:",err)
return
}
defer conn.Close()
fmt.Println("redis连接成功")
//_, err = conn.Do("LPush", "heroList", "songjiang", 23, "long", 29)
//if err != nil {
// fmt.Println(err)
// return
//}
//fmt.Println("LPush success")
//values, _ := redis.Values(conn.Do("lrange", "heroList", "0", "100"))
str, err := redis.String(conn.Do("RPop", "heroList"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(str)
//for _, v := range values {
// fmt.Println(v)
//}
// 或者
//var v1 string
//redis.Scan(values, &v1)
//fmt.Println(v1)
}
func hash() {
////通过go向redis 写入数据和读取数据
////1. 链接到go
//conn, err := redis.Dial("tcp", "127.0.0.1:6379")
//if err != nil {
// fmt.Println("reis connect err=", err)
// return
//}
//fmt.Println("-----------")
//
//defer conn.Close()
//2. 通过go向redis写入数据 string[key-val]
//_, err = conn.Do("HSet", "user", "name", "john")
//if err != nil {
// fmt.Printf("Set err=%v \n", err)
//}
//_, err = conn.Do("HSet", "user", "age", 18)
//if err != nil {
// fmt.Printf("Set err=%v \n", err)
//}
//_, err = conn.Do("HSet", "user", "gender", "boy")
//if err != nil {
// fmt.Printf("Set err=%v \n", err)
//}
//
////3. 从redis读取数据
//
//r, err := redis.String(conn.Do("HGet", "user", "name"))
//if err != nil {
// fmt.Println("get err=", err)
// return
//}
//
////name, ok := r.(string)
//fmt.Println("name:", r)
/*
批量操作
*/
//1.连接到redis数据库
con,err :=redis.Dial("tcp","127.0.0.1:6379")
if err != nil{
fmt.Println("redis连接失败,错误信息:",err)
return
}
defer con.Close()
fmt.Println("redis连接成功")
//2.通过go向redis写入数据
_,err = con.Do("HMSet","user2","name","Bob大米","age","19")
if err != nil{
fmt.Println("hmset出错,错误信息:",err)
return
}
fmt.Println("hmset ok")
//3.通过go向redis读取数据
reply,err := redis.Strings(con.Do("HMGet","user2","name","age"))
if err != nil{
fmt.Println("hmget出错,错误信息:",err)
return
}
fmt.Println("hmget ok")
for i,v := range reply{
fmt.Printf("[%d]=%s\t",i,v)
}
}
redis连接池的创建
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
var pool *redis.Pool
func init() {
pool = &redis.Pool{
MaxIdle:8,// 最大空闲链接
MaxActive:0,// 表示和数据库的最大连接数
IdleTimeout:100,// 最大空闲时间
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "localhost:6379")
},
}
}
func main() {
//先从pool 取出一个链接
conn := pool.Get()
defer conn.Close()
//
_, err := conn.Do("Set", "name", "hiram~")
if err != nil {
fmt.Println(err)
return
}
r, err := redis.String(conn.Do("Get", "name"))
if err != nil {
fmt.Println(err)
}
fmt.Println(r)
}