package storage import ( "net" "github.com/bradfitz/gomemcache/memcache" ) type Memcache struct { db *memcache.Client } type serverSelector struct { addrs []string } func (ss *serverSelector) PickServer(key string) (net.Addr, error) { return &netAddr{ network: "tcp", addr: ss.addrs[0], }, nil } func (ss *serverSelector) Each(each func(net.Addr) error) error { for _, addr := range ss.addrs { if err := each(&netAddr{ network: "tcp", addr: addr, }); err != nil { return err } } return nil } type netAddr struct { network string addr string } func (a *netAddr) Network() string { return a.network } func (a *netAddr) String() string { return a.addr } func NewMemcache(addr string, addrs ...string) (*Memcache, error) { ss := &serverSelector{ addrs: append(addrs, addr), } if err := ss.Each(func(addr net.Addr) error { conn, err := net.Dial("tcp", addr.String()) if err != nil { return err } return conn.Close() }); err != nil { return nil, err } db := memcache.NewFromSelector(ss) return &Memcache{db: db}, nil } func (mc *Memcache) Get(key string) ([]byte, error) { v, err := mc.db.Get(key) return v.Value, err } func (mc *Memcache) Set(key string, value []byte) error { return mc.db.Set(&memcache.Item{ Key: key, Value: value, }) } func (mc *Memcache) Close() error { return mc.db.FlushAll() }