Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Simple groupcache example
// Simple groupcache example: https://github.com/golang/groupcache
// Running 3 instances:
// go run groupcache.go -addr=:8080 -pool=http://127.0.0.1:8080,http://127.0.0.1:8081,http://127.0.0.1:8082
// go run groupcache.go -addr=:8081 -pool=http://127.0.0.1:8081,http://127.0.0.1:8080,http://127.0.0.1:8082
// go run groupcache.go -addr=:8082 -pool=http://127.0.0.1:8082,http://127.0.0.1:8080,http://127.0.0.1:8081
// Testing:
// curl localhost:8080/color?name=red
package main
import (
"errors"
"flag"
"log"
"net/http"
"strings"
"github.com/golang/groupcache"
)
var Store = map[string][]byte{
"red": []byte("#FF0000"),
"green": []byte("#00FF00"),
"blue": []byte("#0000FF"),
}
var Group = groupcache.NewGroup("foobar", 64<<20, groupcache.GetterFunc(
func(ctx groupcache.Context, key string, dest groupcache.Sink) error {
log.Println("looking up", key)
v, ok := Store[key]
if !ok {
return errors.New("color not found")
}
dest.SetBytes(v)
return nil
},
))
func main() {
addr := flag.String("addr", ":8080", "server address")
peers := flag.String("pool", "http://localhost:8080", "server pool list")
flag.Parse()
http.HandleFunc("/color", func(w http.ResponseWriter, r *http.Request) {
color := r.FormValue("name")
var b []byte
err := Group.Get(nil, color, groupcache.AllocatingByteSliceSink(&b))
if err != nil {
http.Error(w, err.Error(), http.StatusNotFound)
return
}
w.Write(b)
w.Write([]byte{'\n'})
})
p := strings.Split(*peers, ",")
pool := groupcache.NewHTTPPool(p[0])
pool.Set(p...)
http.ListenAndServe(*addr, nil)
}

lvhuat commented Nov 23, 2016 edited

What do the handler of /color mean, Do remote groupcahes will request the path for data? Or just a path for debuging?

not bad Fiori, not bad :)

the unfortunate thing about groupcache is that they're not willing to evolve it. I personally think there should be a default cache store which is just an in-memory lru .. that same in-memory lru that they use to actually cache results is what I'd like to use to store my app cacheable data, and not have to have one allocation for my store then group cache with its own allocation of the same data

rbastic commented Dec 11, 2016

Sorry, but you could explain a bit more about what you mean? Why do you want to do this?

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