我在Google App Engine上使用memcache尝试创建云剪贴板
我最近在使用Google Compute Engine,发现它非常有趣,并且免费使用。于是我决定尝试一下Google App Engine,写了一点代码。
Google App Engine的SDK非常出色,使得开发和调试memcache变得非常容易。
输入以下命令,您可以复制post的内容,并在下面的命令中进行粘贴。
echo "test" | curl --data-binary @- --url http://toolbox-1080.appspot.com/copy/#{your key}
cat main.go | curl --data-binary @- --url http://toolbox-1080.appspot.com/copy/#{your key}
curl -s http://toolbox-1080.appspot.com/paste/#{your key}
我写的代码 (Wǒ xiě de
package gaesample
import (
"fmt"
"strings"
"bytes"
"net/http"
"github.com/zenazn/goji"
"github.com/zenazn/goji/web"
"appengine"
"appengine/memcache"
)
func init() {
http.Handle("/", goji.DefaultMux)
goji.Get("/", handler)
goji.Post("/copy/:key", handler2)
goji.Get("/paste/:key", handler3)
}
func handler(c web.C, w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%s", "Hello World")
}
func handler2(c web.C, w http.ResponseWriter, r *http.Request) {
ac := appengine.NewContext(r)
bufbody := new(bytes.Buffer)
bufbody.ReadFrom(r.Body)
body := bufbody.String()
set_key(ac, c.URLParams["key"], body)
}
func handler3(c web.C, w http.ResponseWriter, r *http.Request) {
ac := appengine.NewContext(r)
fmt.Fprintf(w, "%s", get_key(ac, c.URLParams["key"]))
}
func key(k string) string {
s := []string{k, "clipboard"}
return strings.Join(s, "_")
}
func set_key(c appengine.Context, k string, v string) {
item := &memcache.Item{
Key: key(k),
Value: []byte(v),
}
if err := memcache.Add(c, item); err == memcache.ErrNotStored {
if err := memcache.Set(c, item); err != nil {
c.Errorf("error setting item: %v", err)
}
} else if err != nil {
c.Errorf("error adding item: %v", err)
}
c.Infof("the value is %q", item.Value)
}
func get_key(c appengine.Context, k string) string {
if item, err := memcache.Get(c, key(k)); err == memcache.ErrCacheMiss {
c.Infof("item not in the cache")
return ""
} else if err != nil {
c.Errorf("error getting item: %v", err)
return ""
} else {
c.Infof("the value is %q", item.Value)
return string(item.Value)
}
}
Memcache的存储时间
-
- デフォルトでは、できるだけ長い期間キーを保存するようになっている
-
- もしメモリが圧迫されている場合は、新しい値が追加されたときに、最も最近使われていない値から削除される。
- 時間でも日付でも保存期間を設定できる
参考的网站
我在查看「通过Google App Engine首先运行Go的Web应用程序」的过程中,进行了App Engine的安装和路由设置。
查看「golang环境配置」并安装go库。http://qiita.com/yanap/items/536b94425b20b1bfc46e
「Memcache Go API」的文档可以在以下链接找到:https://cloud.google.com/appengine/docs/go/memcache/
通过阅读「使用用户服务」,了解App Engine上下文
https://cloud.google.com/appengine/docs/go/gettingstarted/usingusers
记事
Golang的变量、函数和基础知识
http://qiita.com/mackiso/items/e435e154e3376a68dcca
「如何将Golang中的字节转换为字符串」
http://stackoverflow.com/questions/14230145/如何将字节数组转换为字符串的最佳方法
最近喜欢的Go语言WAF「Goji」添加了Starmkt – 可供Goji实现参考的网址是http://mattn.kaoriya.net/software/lang/go/20141021134209.htm。