Skip to content

Instantly share code, notes, and snippets.

@yosisa
Created March 29, 2014 05:55
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yosisa/9849327 to your computer and use it in GitHub Desktop.
Save yosisa/9849327 to your computer and use it in GitHub Desktop.
groupcache‎ で組み込み型分散キャッシュ ref: http://qiita.com/yosisa/items/4980559f328fb31c3a8d
package main
import (
"encoding/json"
"github.com/codegangsta/martini"
"github.com/golang/groupcache"
"net/http"
"os"
"time"
)
func main() {
addr := os.Getenv("GROUPCACHE_ADDR")
peers := groupcache.NewHTTPPool("http://" + addr)
peers.Set("http://127.0.0.1:8000", "http://127.0.0.1:8001")
go http.ListenAndServe(addr, peers)
heavy := groupcache.NewGroup("heavy", 64<<20, groupcache.GetterFunc(heavyTask))
m := martini.Classic()
m.Get("/_stats", func() []byte {
v, err := json.Marshal(&heavy.Stats)
if err != nil {
panic(err)
}
return v
})
m.Get("/:key", func(params martini.Params) string {
var result string
if err := heavy.Get(nil, params["key"], groupcache.StringSink(&result)); err != nil {
panic(err)
}
return result
})
m.Run()
}
func heavyTask(ctx groupcache.Context, key string, dst groupcache.Sink) error {
time.Sleep(400 * time.Millisecond)
dst.SetString("Value of " + key)
return nil
}
$ GROUPCACHE_ADDR=127.0.0.1:8000 go run main.go
$ GROUPCACHE_ADDR=127.0.0.1:8001 PORT=3001 go run main.go
$ curl localhost:3000/foo # 400ms
$ curl localhost:3001/foo # <1ms
@Focinfi
Copy link

Focinfi commented Mar 19, 2017

Nice demo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment