概念理解
group
group即为一种归类,比如我们定义了一个静态网站,里面有文件、图片、文字,那么我们就可以定位多个 group,分别命名为file/image/text等,这样我们在查询的时候就可以制定对应的group name,举例如下:
var (
peersAddrs = []string{"http://127.0.0.1:8001", "http://127.0.0.1:8002", "http://127.0.0.1:8003"}
)
func main() {
fmt.Println("len args:", len(os.Args))
localAddr := os.Args[1]
fmt.Println("localaddr:", localAddr)
peers := groupcache.NewHTTPPool("http://" + localAddr)
peers.Set(peersAddrs...)
// 这里定义了一个group名字为image
var imageCache = groupcache.NewGroup("image", 8<<30, groupcache.GetterFunc(
func(ctx groupcache.Context, key string, dest groupcache.Sink) error {
result, err := ioutil.ReadFile(key)
if err != nil {
fmt.Printf("read file error %s.\n", err.Error())
return nil
}
fmt.Printf("asking for %s from local file system\n", key)
dest.SetBytes([]byte(result))
return nil
}))
// 这里设置/image路由,groupcache会自动解析该/image路由为groupname
http.HandleFunc("/image", func(rw http.ResponseWriter, r *http.Request) {
var data []byte
k := r.URL.Query().Get("id")
fmt.Printf("user get %s from groupcache\n", k)
imageCache.Get(nil, k, groupcache.AllocatingByteSliceSink(&data))
rw.Write([]byte(data))
})
log.Fatal(http.ListenAndServe(localAddr, nil))
}