原文出处:
请支持该文原创作者
前沿:
这两天试着用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); if e != nil { log. Println ( "failed to create the client" , e); return } 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。。。
测试结果:
服务端的启动
客户端的测试
原文:
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{ fmt.Fprintf( w, "404" ) 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); fmt.Fprintf(w, "哥们,你要查询的key %s 和value %s " ,key,value) } 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编程的实例及常见问题
关于Go语言在服务端做Restful接口和socket通信
原文出处:
请支持该文原创作者