// +build !appengine // Package memcache provides an implementation of httpcache.Cache that uses // gomemcache to store cached responses. // // When built for Google App Engine, this package will provide an // implementation that uses App Engine's memcache service. See the // appengine.go file in this package for details. package memcache import ( "github.com/bradfitz/gomemcache/memcache" ) // Cache is an implementation of httpcache.Cache that caches responses in a // memcache server. type Cache struct { *memcache.Client } // cacheKey modifies an httpcache key for use in memcache. Specifically, it // prefixes keys to avoid collision with other data stored in memcache. func cacheKey(key string) string { return "httpcache:" + key } // Get returns the response corresponding to key if present. func (c *Cache) Get(key string) (resp []byte, ok bool) { item, err := c.Client.Get(cacheKey(key)) if err != nil { return nil, false } return item.Value, true } // Set saves a response to the cache as key. func (c *Cache) Set(key string, resp []byte) { item := &memcache.Item{ Key: cacheKey(key), Value: resp, } c.Client.Set(item) } // Delete removes the response with key from the cache. func (c *Cache) Delete(key string) { c.Client.Delete(cacheKey(key)) } // New returns a new Cache using the provided memcache server(s) with equal // weight. If a server is listed multiple times, it gets a proportional amount // of weight. func New(server ...string) *Cache { return NewWithClient(memcache.New(server...)) } // NewWithClient returns a new Cache with the given memcache client. func NewWithClient(client *memcache.Client) *Cache { return &Cache{client} }