本文会继续之前的任务,在 golang 上搭建 redis client 环境和安装测试 mysql 驱动(driver),确保go可以正确连上 redis 和 mysql 。环境仍然是CentOS-6.x x86-64bit。
由于我们可怜的开发同学,在windows下整了一周仍然没有把环境弄利索,无奈之下,只有老夫亲自出马。
golang 环境的搭建可以参考之前的文章:CentOS-6.x下搭建golang环境的三种方式
redis 安装过程
yum install tclHomehttp://download.redis.io/releases/redis-2.8.6.tar.gz tar zxvf redis-2.8.6.tar.gz cd redis-2.8.6 make make test make install
redis配置文件-片段:
cat /etc/redis.conf daemonize yes pidfile /var/run/redis.pid port 6379 bind 192.168.200.111
启动redis
/usr/local/bin/redis-server /etc/redis.conf
go for redis有众多的redis client,http://redis.io/上面可以任意选一个吧,我这选择了gosexy/redis
安装redis client
go get -u menteslibres.net/gosexy/redis
安装过程有这样两个小问题:
#package menteslibres.net/gosexy/redis: cannot download, $GOPATH not set. For more details see: go help gopath
#package menteslibres.net/gosexy/redis: cannot download, $GOPATH must not be set to $GOROOT. For more details see: go help gopath
解决办法,需要配置GOPATH:
vi /etc/profile add export GOPATH=/home/sudops.com/go source /etc/profile
可以查看下 golang 关于GOPATH的说明:
#go help gopath
Here's an example directory layout:
GOPATH=/home/user/gocode
/home/user/gocode/
src/
foo/
bar/ (go code in package bar)
x.go
quux/ (go code in package main)
y.go
bin/
quux (installed command)
pkg/
linux_amd64/
foo/
bar.a (installed package object)
golang 连接redis测试案例:
cat connredis.go
package main
import (
"menteslibres.net/gosexy/redis"
"log"
)
var host = "192.168.200.111"
var port = uint(6379)
var client *redis.Client
func main() {
var s string
var err error
client = redis.New()
err = client.Connect(host, port)
if err != nil {
log.Fatalf("Connect failed: %s\n", err.Error())
return
}
log.Println("Connected to redis-server.")
// DEL hello
log.Printf("DEL hello\n")
client.Del("hello")
// SET hello 1
log.Printf("SET hello 1\n")
client.Set("hello", 1)
// INCR hello
log.Printf("INCR hello\n")
client.Incr("hello")
// GET hello
log.Printf("GET hello\n")
s, err = client.Get("hello")
if err != nil {
log.Fatalf("Could not GET: %s\n", err.Error())
return
}
log.Printf("> hello = %s\n", s)
client.Quit()
}
golang connect redis 执行结果:
go run connredis.go 2014/02/26 14:01:01 Connected to redis-server. 2014/02/26 14:01:01 DEL hello 2014/02/26 14:01:01 SET hello 1 2014/02/26 14:01:01 INCR hello 2014/02/26 14:01:01 GET hello 2014/02/26 14:01:01 > hello = 2
安装mysql
yum install mysql mysql-server mysql-devel mysql-libs
golang 的mysql 驱动
驱动地址:https://github.com/go-sql-driver/mysql
安装
go get github.com/go-sql-driver/mysql
创建数据库及测试数据:
create database shortlink; grant all privileges on mydb.* to sudops@'%' identified by 'mypasswd'; flush privileges; use mydb; create table squareNum (number int(11) PRIMARY KEY,squareNumber int(11) not null); desc squareNum; +--------------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+---------+------+-----+---------+-------+ | number | int(11) | NO | PRI | NULL | | | squareNumber | int(11) | NO | | NULL | | +--------------+---------+------+-----+---------+-------+
go 连接mysql的完整例子:
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "sudops:mypasswd@tcp(192.168.200.111:3306)/mydb")
if err != nil {
panic(err.Error()) // Just for example purpose. You should use proper error handling instead of panic
}
defer db.Close()
// Prepare statement for inserting data
stmtIns, err := db.Prepare("INSERT INTO squareNum VALUES( ?, ? )") // ? = placeholder
if err != nil {
panic(err.Error()) // proper error handling instead of panic in your app
}
defer stmtIns.Close() // Close the statement when we leave main() / the program terminates
// Prepare statement for reading data
stmtOut, err := db.Prepare("SELECT squareNumber FROM squarenum WHERE number = ?")
if err != nil {
panic(err.Error()) // proper error handling instead of panic in your app
}
defer stmtOut.Close()
// Insert square numbers for 0-24 in the database
for i := 0; i < 25; i++ {
_, err = stmtIns.Exec(i, (i * i)) // Insert tuples (i, i^2)
if err != nil {
panic(err.Error()) // proper error handling instead of panic in your app
}
}
var squareNum int // we "scan" the result in here
// Query the square-number of 13
err = stmtOut.QueryRow(13).Scan(&squareNum) // WHERE number = 13
if err != nil {
panic(err.Error()) // proper error handling instead of panic in your app
}
fmt.Printf("The square number of 13 is: %d", squareNum)
// Query another number.. 1 maybe?
err = stmtOut.QueryRow(1).Scan(&squareNum) // WHERE number = 1
if err != nil {
panic(err.Error()) // proper error handling instead of panic in your app
}
fmt.Printf("The square number of 1 is: %d", squareNum)
}
测试结果:
go run connmysql.go The square number of 13 is: 169 The square number of 1 is: 1
Erveryting goes perfect,一切看上去非常美好,golang 环境上搭建redis client和mysql驱动都已经配置完毕,golang 连接redis和mysql的环境都准备好啦,开发终于可以正式开始了,还等什么?


Pingback: two memcache libraries in golang » 运维·速度