Phase 1 part 2 of ADR-0022 (companion to PR #22 rate-limit). In-memory cache service via go-cache, used by /api/version (60s TTL). 6/6 unit tests pass. ~95% Mistral autonomous via ICM workspace, cost €2.50 stages 01-02 (50% reduction vs T5 thanks to pre-extracted snippets in shared/). Co-authored-by: Gabriel Radureau <arcodange@gmail.com> Co-committed-by: Gabriel Radureau <arcodange@gmail.com>
57 lines
1.5 KiB
Go
57 lines
1.5 KiB
Go
package cache
|
|
|
|
import (
|
|
"time"
|
|
|
|
gocache "github.com/patrickmn/go-cache"
|
|
)
|
|
|
|
// Service defines the interface for cache operations
|
|
type Service interface {
|
|
Set(key string, value interface{}, ttl time.Duration)
|
|
Get(key string) (interface{}, bool)
|
|
Delete(key string)
|
|
Flush()
|
|
ItemCount() int
|
|
}
|
|
|
|
// InMemoryService implements Service using go-cache library
|
|
type InMemoryService struct {
|
|
cache *gocache.Cache
|
|
}
|
|
|
|
// NewInMemoryService creates a new in-memory cache service
|
|
// defaultTTL: default time-to-live for cache items
|
|
// cleanupInterval: interval at which expired items are cleaned up
|
|
func NewInMemoryService(defaultTTL, cleanupInterval time.Duration) Service {
|
|
c := gocache.New(defaultTTL, cleanupInterval)
|
|
return &InMemoryService{cache: c}
|
|
}
|
|
|
|
// Set stores a value in the cache with the specified TTL
|
|
func (s *InMemoryService) Set(key string, value interface{}, ttl time.Duration) {
|
|
s.cache.Set(key, value, ttl)
|
|
}
|
|
|
|
// Get retrieves a value from the cache
|
|
// Returns the value and true if found, nil and false if not found or expired
|
|
func (s *InMemoryService) Get(key string) (interface{}, bool) {
|
|
val, found := s.cache.Get(key)
|
|
return val, found
|
|
}
|
|
|
|
// Delete removes an item from the cache
|
|
func (s *InMemoryService) Delete(key string) {
|
|
s.cache.Delete(key)
|
|
}
|
|
|
|
// Flush clears all items from the cache
|
|
func (s *InMemoryService) Flush() {
|
|
s.cache.Flush()
|
|
}
|
|
|
|
// ItemCount returns the number of items currently in the cache
|
|
func (s *InMemoryService) ItemCount() int {
|
|
return s.cache.ItemCount()
|
|
}
|