Using Go with Redis

在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)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值