下载依赖
在go.mod文件添加依赖项
require github.com/garyburd/redigo v1.6.2
github地址:
https://github.com/garyburd/redigo
文档地址:
http://godoc.org/github.com/garyburd/redigo/redis
关于如何使用go mod可以参考
https://zhuanlan.zhihu.com/p/103534192
读写操作
string类型
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
func main() {
//连接reids
conn, err := redis.Dial("tcp", "0.0.0.0:6379")
if err != nil {
fmt.Println("连接出错,",err)
return
}
fmt.Println("连接成功....")
defer conn.Close()
//向redis写入数据
_, err = conn.Do("set", "name", "小明") //等价于在redis服务端执行 set name 小明
if err != nil {
fmt.Println("写入错误",err)
return
}
fmt.Println("写入成功..")
//从redis读取数据
s, err := redis.String(conn.Do("get", "name"))
if err != nil {
fmt.Println("读取失败...",err)
return
}
fmt.Printf("读取成功 name = %s",s)
}
批量读写多个key-value
//连接reids
conn, err := redis.Dial("tcp", "0.0.0.0:6379")
if err != nil {
fmt.Println("连接出错,",err)
return
}
fmt.Println("连接成功....")
defer conn.Close()
//向redis写入数据
_, err = conn.Do("mset", "name", "小明","age","23","address","山东省济南市xx区") //等价于在redis服务端执行 set name 小明
if err != nil {
fmt.Println("写入错误",err)
return
}
fmt.Println("写入成功..")
//从redis读取数据
s, err := redis.Strings(conn.Do("mget", "name","age","address"))
if err != nil {
fmt.Println("读取失败...",err)
return
}
for i, v := range s {
fmt.Printf("r[%d]=%s\n", i, v)
}
hash类型
conn, err := redis.Dial("tcp", "0.0.0.0:6379")
if err != nil {
fmt.Println("连接出错,",err)
return
}
fmt.Println("连接成功....")
defer conn.Close()
_,err = conn.Do("hset","user001","name","小明")
if err != nil {
fmt.Println("写入错误",err)
return
}
fmt.Println("写入成功..")
_,err = conn.Do("hset","user001","age","23")
if err != nil {
fmt.Println("写入错误",err)
return
}
fmt.Println("写入成功..")
//从redis读取数据
s, err := redis.String(conn.Do("hget", "user001","name"))
if err != nil {
fmt.Println("读取失败...",err)
return
}
fmt.Printf("读取成功 name = %s\n",s)
s2, err := redis.String(conn.Do("hget", "user001","age"))
if err != nil {
fmt.Println("读取失败...",err)
return
}
fmt.Printf("读取成功 age = %s\n",s2)
hash批量读写
conn, err := redis.Dial("tcp", "0.0.0.0:6379")
if err != nil {
fmt.Println("连接出错,",err)
return
}
fmt.Println("连接成功....")
defer conn.Close()
_,err = conn.Do("hmset","user001","name","小明","age","23")
if err != nil {
fmt.Println("写入错误",err)
return
}
fmt.Println("写入成功..")
//从redis读取数据
s2, err := redis.Strings(conn.Do("hmget", "user001","name","age"))
if err != nil {
fmt.Println("读取失败...",err)
return
}
for i, v := range s2 {
fmt.Printf("r[%d]=%s\n", i, v)
}
连接池
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
//全局变量连接池
var pool *redis.Pool
func init() {
pool = &redis.Pool{
MaxIdle: 8, //最大空闲链接数
MaxActive: 0, // 表示和数据库的最大链接数, 0 表示没有限制
IdleTimeout: 100, // 最大空闲时间
Dial: func() (redis.Conn, error) { // 初始化链接的代码, 链接哪个ip 的redis
return redis.Dial("tcp", "localhost:6379")
},
}
}
func main() {
//从连接池中取出一个连接
conn := pool.Get()
defer conn.Close()
_, err := conn.Do("Set", "name", "汤姆猫~~")
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 取出链接,一定保证链接池是没有关闭
//pool.Close()
conn2 := pool.Get()
_, err = conn2.Do("Set", "name2", "汤姆猫~~2")
if err != nil {
fmt.Println("conn.Do err~~~~=", err)
return
}
//取出
r2, err := redis.String(conn2.Do("Get", "name2"))
if err != nil {
fmt.Println("conn.Do err=", err)
return
}
fmt.Println("r=", r2)
}