分享
  1. 首页
  2. 文章

Using Go with Redis

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

在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

关注微信
1834 次点击
1 回复 | 直到 2025年05月15日 09:02:47
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏