我在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。

bannerAds