Compogo Memcached — это полноценный Memcached-клиент для Compogo, построенный поверх популярной библиотеки bradfitz/gomemcache. Предоставляет полный API оригинальной библиотеки, настраивается через флаги и может использоваться как самостоятельный кэш или как драйвер для централизованной системы кэширования Compogo Cache.
go get github.com/Compogo/memcachedpackage main
import (
"github.com/Compogo/compogo"
"github.com/Compogo/memcached"
"github.com/bradfitz/gomemcache/memcache"
)
func main() {
app := compogo.NewApp("myapp",
compogo.WithOsSignalCloser(),
memcached.Component, // добавляем Memcached-клиент
compogo.WithComponents(
userServiceComponent,
),
)
if err := app.Serve(); err != nil {
panic(err)
}
}
// Использование в сервисе
var userServiceComponent = &component.Component{
Dependencies: component.Components{memcached.Component},
Execute: component.StepFunc(func(c container.Container) error {
return c.Invoke(func(cache memcached.Cache) {
service := &UserService{cache: cache}
service.Start()
})
}),
}
type UserService struct {
cache memcached.Cache
}
func (s *UserService) GetUser(ctx context.Context, id int) (*User, error) {
// Пытаемся достать из кэша
item, err := s.cache.Get(fmt.Sprintf("user:%d", id))
if err == nil {
var user User
json.Unmarshal(item.Value, &user)
return &user, nil
}
// Нет в кэше — грузим из БД
user, err := s.db.LoadUser(id)
if err != nil {
return nil, err
}
// Кладём в кэш
data, _ := json.Marshal(user)
s.cache.Set(&memcache.Item{
Key: fmt.Sprintf("user:%d", id),
Value: data,
Expiration: 300, // 5 минут
})
return user, nil
}Интерфейс Cache повторяет все методы оригинальной библиотеки:
// Базовые операции
cache.Set(&memcache.Item{Key: "key", Value: data})
item, err := cache.Get("key")
cache.Delete("key")
// Множественное чтение
items, err := cache.GetMulti([]string{"key1", "key2"})
// Атомарные операции
newVal, _ := cache.Increment("counter", 1)
newVal, _ := cache.Decrement("counter", 1)
// Условное обновление
err := cache.CompareAndSwap(&memcache.Item{
Key: "key",
Value: newData,
Expiration: 300,
})
// Модификация данных
cache.Append(&memcache.Item{Key: "log", Value: []byte("new line")})
cache.Prepend(&memcache.Item{Key: "log", Value: []byte("header")})
// Управление сроком жизни
cache.Touch("key", 600) // продлить на 10 минут
// Проверка подключения
err := cache.Ping()
// Массовые операции
cache.FlushAll() // очистить всё
cache.DeleteAll() // удалить всёtype Service struct {
cache memcached.Cache // через интерфейс
// или
raw *memcache.Client // напрямую
}import (
"github.com/Compogo/cache"
"github.com/Compogo/memcached/registration"
)
app := compogo.NewApp("myapp",
cache.Component,
memcached.Component,
registration.Component, // регистрирует "memcached" драйвер
)
// Теперь можно использовать через cache.CacheInterface[[]byte]
// с флагом --cache.driver=memcached