在Go语言中使用redis数据库
日期:2016-09-13
作者:未知
原文:https://dinosaurscode.xyz/go/2016/09/13/using-go-with-redis/?utm_source=studygolang&utm_medium=email&nsukey=d7foHOu2JWuVtNx567nmYebGiV3xA77Y66gJwySUW6tBi9LTombwJLWAzrYVdYP1IZH1MZzOhcz%2BGh8xt%2FggTToFElonX%2FrUuMc%2B%2FT0eQnzrZLJM7%2BkF8QNBQ3zfhlNkQ5ZlFiDb04jx4X98ZPqSHPtXwX%2FOUW8sfR18L2zkUq0SZFfhtAfvWDtYlCg1unfC
翻译: 一花一世界
时间:2016-10-23
排版:马克飞象(https://maxiang.io)
正文
在这个范例中,你将看到怎样在GO中使用Redis。 首先同时最重要的是连接redis服务,用如下的命令
$ go get github.com/garyburd/redigo
接着,确认你已经安装了redis和启动了redis服务器
$ redis-server
连接到Redis
函数redis.Dial()返回一个redis.Conn的类型,用于发送命令到redis服务器,并返回一个应答。
package main
import "fmt"
import "github.com/garyburd/redigo/redis"
func main() {
// Connect to the default port
conn, err := redis.Dial("tcp", ":6379")
if err != nil {
panic(err.Error())
}
defer conn.Close()
// Send Redis a ping command and wait for a pong
pong, _ := conn.Do("PING")
fmt.Println(pong)
// Output: PONG
}
存储和获取数据
设置一个字符串
ok, _ := conn.Do("SET", "name", "john")
fmt.Println(ok)
// Output: OK
取值
name, _ := conn.Do("GET", "name")
fmt.Println(name)
// Output: [106 111 104 110]
噢, 不,那不是我想要的结果。
有时,你想明确的把结果转成和适当的类型, 这可以用类型断言或是redigo的帮助函数。
// 注意用外层用redis.Stirng()封装
name, _ := redis.String(conn.Do("GET", "name"))
fmt.Println(name)
// Output: john
解码成json
你可以把一个复杂的数据类型,例如结构体用json的格式存起来。
// 把结构体存在json结构中, 用列表的形式存取。
type User struct {
Name string
Age int
}
user1 := User{"John", 22}
encoded, _ := json.Marshal(user1)
conn.Do("LPUSH", "users", encoded)
现在解码到一个结构体中
//从redis中提取,并解码到一个结构中
type User struct {
Name string
Age int
}
var unencoded *User
// 把用户列表映射到一个名为users的字符串数组中
users, _ := redis.Strings(conn.Do("LRANGE", "users", 0, -1))
// 抽取一个字符,然后把它转成字节类型,然后解码到unencoded
json.Unmarshal([]byte(users[0]), &unencoded)
fmt.Println(unencoded.Name)
// 输出: John
最后,应该在web应用中使用一个连接池
http开发者应该从连接池中获取一个连接,并且当完成时,关闭它。
package main
import "github.com/garyburd/redigo/redis"
import "net/http"
// Global pool that handlers can grab a connection from
var pool = newPool()
// Pool configuration
func newPool() *redis.Pool {
return &redis.Pool{
MaxIdle: 80,
MaxActive: 12000,
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", ":6379")
},
}
}
func home(res http.ResponseWriter, req *http.Request) {
// Grab a connection and make sure to close it with defer
conn := pool.Get()
defer conn.Close()
pong, _ := redis.Bytes(conn.Do("PING"))
res.Write(pong)
}
func main() {
http.HandleFunc("/", home)
http.ListenAndServe(":8080", nil)
}