storage/memcached.go

81 lines
1.4 KiB
Go

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()
}