cache.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package aksk
  2. import "sync"
  3. // MemoryCache presents a thread safe memory cache
  4. type MemoryCache struct {
  5. sync.Mutex // handling r/w for cache
  6. cacheHolder map[string]string // cache holder
  7. cacheKeys []string // cache keys
  8. MaxCount int // max cache entry count
  9. }
  10. // NewCache inits an new MemoryCache
  11. func NewCache(maxCount int) *MemoryCache {
  12. return &MemoryCache{
  13. cacheHolder: make(map[string]string, maxCount),
  14. MaxCount: maxCount,
  15. }
  16. }
  17. // Add an new cache item
  18. func (cache *MemoryCache) Add(cacheKey string, cacheData string) {
  19. cache.Lock()
  20. defer cache.Unlock()
  21. if len(cache.cacheKeys) >= cache.MaxCount && len(cache.cacheKeys) > 1 {
  22. delete(cache.cacheHolder, cache.cacheKeys[0]) // delete first item
  23. cache.cacheKeys = append(cache.cacheKeys[1:]) // pop first one
  24. }
  25. cache.cacheHolder[cacheKey] = cacheData
  26. cache.cacheKeys = append(cache.cacheKeys, cacheKey)
  27. }
  28. // Get a cache item by its key
  29. func (cache *MemoryCache) Get(cacheKey string) string {
  30. cache.Lock()
  31. defer cache.Unlock()
  32. return cache.cacheHolder[cacheKey]
  33. }