Using Go with Redis

zistxym · · 1400 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在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)
}

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:zistxym

查看原文:Using Go with Redis

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1400 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传