原文出处:http://www.jb51.cc/article/p-wqmxalhu-ng.html
请支持该文原创作者 rfyiamcool 的博客 峰云,就她了。
前沿:
这两天试着用golang做一些高性能的api,不想把压力到聚合在平台的接口上。平台因为要做很多耗时间的操作,uwsgi下会出现少许错误,找了一圈不知道如何解决该问题。 暂时先绕道而行,先拿简单的接口来做测试,慢慢的把复杂的操作也迁移到golang上。
话说以前高性能的接口,我用的最多的方案还是Nginx lua的组合,超强,大家可以看看我以前写的Nginx lua的文章,各方面没得说。只是这段时间正在看golang 的,就试着用golang实现redis的api,先来个简单的试试手。
里面引用的是golang自带的http模块,redis是自己down的。
golang redis的配置方法:
1
2
3
4
|
cd $GOPATH/src
git clone git:
//github.com/alphazero/Go-Redis.git redis
cd redis
go install
|
先简单说下,golang对于redis的操作方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
//xiaorui.cc
package main
import
(
"os"
;
"bufio"
;
"log"
;
"fmt"
;
"redis"
;
)
/*
hello world,redis style.
*/
func main () {
// create the client.
Here
we are using a synchronous client.
//
Using
the default
ConnectionSpec
,we are specifying the client to connect
// to db 13 (e.g.
SELECT
13),
and
a password
of
go-redis (e.g.
AUTH
go-redis)
spec := redis.
DefaultSpec
().
Db
(13).
Password
(
"go-redis"
);
client,e := redis.
NewSynchClientWithSpec
(spec);
key :=
"examples/hello/user.name"
;
value,e := client.
Get
(key);
if
e!= nil { log.
Println
(
"error on Get"
,e); return }
if
value == nil {
fmt.
Printf
(
"\nHello,don't believe we've met before!\nYour name? "
);
reader:= bufio.
NewReader
(os.
Stdin
);
user,_ := reader.
ReadString
(byte(
'\n'
));
if
len(user) > 1 {
user = user[
0:len
(user)-1];
value = []byte(user);
client.
Set
(key,value);
} else {
fmt.
Printf
(
"vafanculo!\n"
);
return;
}
}
fmt.
Printf
(
"Hey,ciao %s!\n"
,fmt.
Sprintf
(
"%s"
,value));
}
|
我写的实例,大家看懂了后,完全可以做更多的扩展。
其实golang自带的http很有mvc的感觉,三者做了一些分离,很像python里面的web.py tornado。。。
测试结果:
服务端的启动
客户端的测试
原文:http://www.jb51.cc/article/p-wqmxalhu-ng.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
//xiaorui.cc
package
main
import
(
"fmt"
"net/http"
"io/IoUtil"
"log"
"time"
"redis"
)
//xiaorui.cc
const
AddForm = `
<html><body>
<form method=
"POST"
action=
"/add"
>
Name: <input type=
"text"
name=
"name"
>
Age: <input type=
"text"
name=
"age"
>
<input type=
"submit"
value=
"Add"
>
</form>
</body></html>
`
const
setform = `
<html><body>
<form method=
"POST"
action=
"/set"
>
key: <input type=
"text"
name=
"key"
>
value: <input type=
"text"
name=
"value"
>
<input type=
"submit"
value=
"set"
>
</form>
</body></html>
`
func Handler( w http.ResponseWriter,r *http.Request ){
path := r.URL.Path[
1
:]
if
path ==
"favicon.ico"
{
http.NotFound(w,r)
return
}
if
path ==
""
{
path =
"index.html"
}
contents,err:= IoUtil.ReadFile( path )
if
err !=nil{
return
}
fmt.Fprintf( w,
"%s\n"
,contents )
}
func Add( w http.ResponseWriter,r *http.Request ){
name := r.FormValue(
"name"
)
age := r.FormValue(
"age"
)
if
name ==
""
|| age ==
""
{
fmt.Fprint(w,AddForm)
return
}
fmt.Fprintf(w,
"Save : Your name is %s,You age is %s"
,name,age)
}
func redisset( w http.ResponseWriter,r *http.Request ){
key := r.FormValue(
"key"
)
value := r.FormValue(
"value"
)
if
key ==
""
|| value ==
""
{
fmt.Fprint(w,setform)
return
}
spec := redis.DefaultSpec().Db(
0
).Password(
""
);
client,e := redis.NewSynchClientWithSpec (spec);
if
e != nil { log.Println (
"服务器连接有异常"
,e);
return
}
inva := []byte(value)
client.Set(key,inva);
fmt.Fprintf(w,
"哥们,你输入的key %s 和value %s 已经插入到redis里面了"
,key,key)
}
func redisget( w http.ResponseWriter,r *http.Request ){
key := r.FormValue(
"key"
)
if
key ==
""
{
fmt.Fprint(w,setform)
return
}
spec := redis.DefaultSpec().Db(
0
).Password(
""
);
client,e := redis.NewSynchClientWithSpec (spec);
if
e != nil { log.Println (
"服务器连接有异常"
,e);
return
}
value,e := client.Get(key);
}
func valueget(w http.ResponseWriter,r *http.Request) {
params := r.URL.Query()
user := params.Get(
"user"
)
fmt.Fprintf(w,
"you are get user %s"
,user)
}
func main(){
http.HandleFunc(
"/"
,Handler)
http.HandleFunc(
"/add"
,Add)
http.HandleFunc(
"/redisset"
,redisset)
http.HandleFunc(
"/redisget"
,redisget)
http.HandleFunc(
"/valueget"
,valueget)
s := &http.Server{
Addr:
":80"
,
ReadTimeout:
30
* time.Second,
WriteTimeout:
30
* time.Second,
MaxHeaderBytes:
1
<<
20
,
}
log.Fatal(s.ListenAndServe())
}
|
对于go的基础教程,我也写过其他的文章,大家可以参考下。
关于Golang语言的web编程的实例及常见问题
http://www.jb51.cc/article/p-cvbhvbgk-ng.html
关于Go语言在服务端做Restful接口和socket通信
http://www.jb51.cc/article/p-usbcgzmu-ng.html
原文出处:http://www.jb51.cc/article/p-wqmxalhu-ng.html
请支持该文原创作者 rfyiamcool 的博客 峰云,就她了。