windows redis下载地址
https://github.com/microsoftarchive/redis/releases/download/win-3.2.100/Redis-x64-3.2.100.zip
redis操作原理图
redis启动
./redis-server.exe redis.conf
golang操作redis
安装第三方开源redis库
-
使用第三方开源的redis库:
github.com/garyburd/redigo/redis -
安装第三方redis库,在 GOPATH路径下执行安装命令
d:\goproject
go get github.com/garyburd/redigo/redis
Set/Get接口
package main
import (
"fmt"
"github.com/garyburd/redigo/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
}
defer conn.Close()
//2.通过go向redis写入数据 string[key-val]
_, err = conn.Do("set","name", "tomjerry 猫")
if err != nil {
fmt.Println("set err=", err)
return
}
//3. 通过go向redis读取数据string[key-val]
r, err := redis.String(conn.Do("Get", "name"))
if err != nil {
fmt.Println("get err", err)
return
}
fmt.Println("操作ok", r)
}
操作hash
- 对hash数据结构,field-val 是一个一个放入和读取
package main
import (
"fmt"
"github.com/garyburd/redigo/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
}
defer conn.Close()
//2. 通过go向redis写入数据string[key-val]
_, err = conn.Do("HSet", "user01", "name", "john")
if err != nil {
fmt.Println("hset err=", err)
return
}
_, err = conn.Do("HSet", "user01", "age", 18)
if err != nil {
fmt.Println("hset err=", err)
return
}
//3. 通过go从redis读取数据
r1, err := redis.String(conn.Do("HGet","user01", "name"))
if err != nil {
fmt.Println("hget err=", err)
return
}
r2, err := redis.Int(conn.Do("HGet", "user01", "age"))
if err != nil {
fmt.Println("hget err=", err)
return
}
fmt.Printf("操作ok r1=%v r2=%v \n", r1, r2)
}
- 对hash数据结构,field-val 批量放入和读取
package main
import (
"fmt"
"github.com/garyburd/redigo/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
}
defer conn.Close()
//2. 通过go向redis写入数据string[key-val]
_, err = conn.Do("HMSet", "user02", "name", "john", "age", 19)
if err != nil {
fmt.Println("HMSet err=", err)
return
}
//3. 通过go向redis读取数据
r, err := redis.Strings(conn.Do("HMGet", "user02", "name", "age"))
if err != nil {
fmt.Println("hget err=", err)
return
}
for i, v := range r {
fmt.Printf("r[%d]=%s\n", i, v)
}
}
批量Set/Get数据
package main
import (
"fmt"
"github.com/garyburd/redigo/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
}
defer conn.Close()
//2. 通过go向redis写入数据string[key-val]
_, err = conn.Do("MSet", "name", "wuxing", "age", 20)
if err != nil {
fmt.Println("MSet err=", err)
return
}
//3. 通过go向redis读取数据
r, err := redis.Strings(conn.Do("MGet", "name", "age"))
if err != nil {
fmt.Println("MGet err=", err)
return
}
for _, v := range r {
fmt.Println(v)
}
}
给数据设置有效时间
_, err = conn.Do("expire", "name", 10)
package main
import (
"fmt"
"github.com/garyburd/redigo/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
}
defer conn.Close()
//给name数据设置有效时间为10s
_, err = conn.Do("expire", "name", 10)
if err != nil {
fmt.Println("expire err=", err)
return
}
//通过go从redis读取数据
r, err := redis.Strings(conn.Do("MGet", "name", "age"))
if err != nil {
fmt.Println("MGet err=", err)
return
}
for _, v := range r {
fmt.Println(v)
}
}
操作list
package main
import (
"fmt"
"github.com/garyburd/redigo/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
}
defer conn.Close()
_, err = conn.Do("lpush", "heroList", "1.张三", 30, "2.李四", 20)
if err != nil {
fmt.Println("lpush err=", err)
return
}
//通过go从redis读取数据
r, err := redis.String(conn.Do("rpop", "heroList"))
if err != nil {
fmt.Println("rpop err=", err)
return
}
fmt.Println(r)
}
redis连接池
- 事先初始化一定数量的连接,放入到连接池
- 当go需要操作redis时,直接从redis连接池取出连接即可
- 这样可以节省临时获取redis连接的时间,从而提高效率
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
//定义一个全局的pool
var pool *redis.Pool
//当启动程序时,就初始化连接池
func init() {
pool = &redis.Pool{
Dial: func() (conn redis.Conn, e error) {
return redis.Dial("tcp", "127.0.0.1:6379")
},
MaxIdle: 8,//最大空闲连接数
MaxActive: 0,//最大连接数,0 表示没有限制
IdleTimeout: 100,//最大空闲时间
}
}
func main() {
//先从pool取出一个连接
conn := pool.Get()
defer conn.Close()
_, err := conn.Do("Set", "name", "tom猫")
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取出连接,一定保证连接池是没有关闭的
conn2 := pool.Get()
_, err = conn2.Do("Set", "name2", "tom猫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("r2=", r2)
}