Go操控Redis
1.安装第三方开源Redis 库
2.Set/Get 接口
通过 Golang 添加和获取 key-value 比如 name:tom~
package main
import (
"fmt"
"redigo-master/redis"//导入包
)
func main() {
//通过go向redis写入数据和读取数据
//1.连接到redis
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("redis dial err", err)
return
}
fmt.Println("redis dial ok", conn)
//操作string类型,向redis中写入数据 string [key-val]
_, err = conn.Do("set", "name", "john猫") //返回结果和错误信息,写入结果可以省略
if err != nil {
fmt.Println("redis set err", err)
return
}
defer conn.Close() //记得关闭
//读取数据
r, err := conn.Do("get", "name") //读取数据结果当然要接收
if err != nil {
fmt.Println("redis set err", err)
return
}
//!!!!!注意,由于conn.Do("get", "name")返回的是interface()空接口类型
//且name对应的值为字符串,要将其转为字符串
//nameString := r.(string)//会出现错误:panic: interface conversion: interface {} is []uint8, not string
nameString := string(r.([]byte)) //可以但麻烦
//最好是直接利用redis包中提供的方法转
//r, err := redis.String(conn.Do("get", "name"))
fmt.Println("redis get ok:", nameString)
3.操作hash类型
field-val 可以是一个一个放入和读取,也可以批量放入和读取
//逐个写入
_, err = conn.Do("HSet", "user01", "name", "john")
_, err = conn.Do("HSet", "user01", "age", 18)
//逐个读取,注意逐个将空接口转为对应类型
r1, err := redis.String(conn.Do("HGet", "user01", "name"))
r2, err := redis.Int(conn.Do("HGet", "user01", "age"))
fmt.Printf("操作 ok r1=%v r2=%v \n", r1, r2)
//也可以是批量放入和读取
_, err = conn.Do("HMSet", "user02", "name", "john", "age", 19)
//空接口转为多种数据类型用redis.Strings()
r3, err := redis.Strings(conn.Do("HMGet", "user02", "name", "age"))
for i, v := range r3 {
fmt.Printf("r[%d]=%s\n", i, v)
}
}
4. 给数据设置有效时间
给 name 数据设置有效时间为 10s
_, err = c.Do("expire", "name", 10)
5. 操作List
_, err = c.Do("lpush", "heroList", "no1:宋江", 30, "no2:卢俊义", 28)
r, err := redis.String(c.Do("rpop", "heroList"))
6. Redis 链接池
说明: 通过 Golang 对 Redis 操作, 还可以通过 Redis 链接池, 流程如下:
(1)事先初始化一定数量的链接,放入到链接池
(2)当 Go 需要操作 Redis 时,直接从 Redis 链接池取出链接即可。
(3)这样可以节省临时获取 Redis 链接的时间,从而提高效率.
使用案例:
package main
import (
"fmt"
"redigo-master/redis"
)
// 定义一个全局的redis链接池
var pool *redis.Pool
// 当程序启动时,就初始化连接池
func init() {
pool = &redis.Pool{
MaxIdle: 8, //最大空闲连接数
MaxActive: 0, //表示和数据库的最大链接数,0表示没有限制
IdleTimeout: 100, //最大空闲时间
Dial: func() (redis.Conn, error) {//初始化连接,pool连接到redis
return redis.Dial("tcp", "127.0.0.1:6379")
},
}
}
func main() {
conn := pool.Get() //先从pool中取出一个链接
defer conn.Close() //记得将链接延迟关闭
//存入数据
_, err := conn.Do("set", "name", "john猫")
if err != nil {
fmt.Println(err)
return
}
//取出数据
r1, err := redis.String(conn.Do("get", "name"))
if err != nil {
fmt.Println(err)
}
fmt.Println(r1)
pool.Close() //关闭连接池,关闭后就不能再取出链接了
}