10.2 Go redis
redis是NoSQL数据, 不是传统的关系型数据库。linux,windows环境皆可安装。
https://redis.io http://www.redis.cn
redis(Remote Dictionary Server)远程字典服务器,性能非常高,单机15W QPS,适合缓存,持久化数据。
1.1. Go操作redis
使用第三方开源的 redis 库: github.com/garyburd/redigo/redis
go get github.com/garyburd/redigo/redis
获取、设置redis的key-value
string类型
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func main() { conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { fmt.Println("连接redis出错,", err) return } defer conn.Close() //连接redis,写入数据 string res, err := conn.Do("Set", "name", "alexdsb") if err != nil { fmt.Println("写入数据出错,", err) return } fmt.Println(res) //读取redis数据 data, err := redis.String(conn.Do("Get", "name")) if err != nil { fmt.Println("读取数据出错,", err) return } fmt.Println("读取出redis数据:", data) }
Go操作redis hash类型
127.0.0.1:6379> HSET key field value
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func main() { conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { fmt.Println("连接redis出错,", err) return //如果函数异常,直接退出 } //函数推出前,关闭redis连接 defer conn.Close() //写入hash类型数据 //写入哈希类型,新闻01,标题 _, err = conn.Do("HSet", "news01", "title", "golang") if err != nil { fmt.Println("HSet err:", err) return //如果函数异常,直接退出 } //写入哈希类型,新闻01,内容 _, err = conn.Do("HSet", "news01", "content", "life is short ,i use golang") if err != nil { fmt.Println("HSet err:", err) return //如果函数异常,直接退出 } //读取hash数据类型 data, err := redis.String(conn.Do("HGet", "news01", "title")) if err != nil { fmt.Println("HGet err:", err) return } fmt.Println("HGet data is :", data) //读取hash数据类型 d2, err := redis.String(conn.Do("HGet", "news01", "content")) if err != nil { fmt.Println("HGet err:", err) return } fmt.Println("HGet data is :", d2) }
go操作redis,hash类型,写入多个field-value
127.0.0.1:6379> HMSET key field value [field value ...]
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func main() { conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { fmt.Println("连接redis出错,", err) return //如果函数异常,直接退出 } //函数推出前,关闭redis连接 defer conn.Close() //写入多个字段 _, err = conn.Do("HMSet", "news02", "title", "gogogogogogog", "content", "pypypypypypy") if err != nil { fmt.Println("HMSet err:", err) return } ////读取多个数据 data, err := redis.Strings(conn.Do("HMGet", "news02", "title", "content")) if err != nil { fmt.Println("HMGet err:", err) return } //for i, v := range data { // fmt.Printf("data[%d]=%s\n", i, v) //} fmt.Println(data) }
设置redis数据过期时间
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func main() { conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { fmt.Println("连接redis出错,", err) return //如果函数异常,直接退出 } defer conn.Close() //给redis的key设置过期时间,必选保证key存在!! res, err := conn.Do("expire", "age2", 20) if err != nil { fmt.Println(err) return } fmt.Println(res) //data, err := redis.String(conn.Do("Get", "age2")) //if err != nil { // fmt.Println(err) //} //fmt.Println(data) }
golang操作redis的list
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func main() { conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { fmt.Println("连接redis出错,", err) return //如果函数异常,直接退出 } //go操作list //注意坑,这里不能再次写入,数据追加写入队列 _, err = conn.Do("lpush", "duilie", "alex", "wupeiqi", "wenzhou", "大西瓜") if err != nil { fmt.Println(err) return } data, err := redis.Strings(conn.Do("lrange", "duilie", "0", "-1")) if err != nil { fmt.Println(err) return } fmt.Println(data) }
1.2. redis链接池
1.初始化一定数量的链接放入到链接池
2.go需要操作redis时,直接从链接池取出链接
3.节省临时获取redis链接的时间,提高效率
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) //全局变量类型声明 var pool *redis.Pool //初始化函数,进行链接池初始化 func init() { //redis.pool结构体中提供了参数用法 pool = &redis.Pool{ MaxIdle: 8, //最大空闲链接数 MaxActive: 0, //保持链接数,0是没限制 IdleTimeout: 100, //最大空闲时间 //初始化连接的代码,匿名函数 Dial: func() (redis.Conn, error) { return redis.Dial("tcp", "127.0.0.1:6379") }, } } func main() { //从pool中取出一个链接 conn := pool.Get() defer conn.Close() //设置redis数据 _, err := conn.Do("set", "name", "大狗子") if err != nil { fmt.Println(err) return } //取出redis数据 data, err := redis.String(conn.Do("get", "name")) if err != nil { fmt.Println(err) return } fmt.Println(data) //想要从pool取出redis连接,必须保证链接池没关闭 //pool.Close() //关闭Pool池后,就无法取出redis链接了 conn2 := pool.Get() _, err = conn2.Do("Set", "name2", "大狗子222") if err != nil { fmt.Println(err) return } //取出数据 //取出redis数据 data2, err := redis.String(conn.Do("get", "name2")) if err != nil { fmt.Println(err) return } fmt.Println(data2) }