mirror of https://github.com/statping/statping
				
				
				
			
		
			
				
	
	
		
			74 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
package handlers
 | 
						|
 | 
						|
import (
 | 
						|
	"sync"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
var CacheStorage Cacher
 | 
						|
 | 
						|
type Cacher interface {
 | 
						|
	Get(key string) []byte
 | 
						|
	Delete(key string)
 | 
						|
	Set(key string, content []byte, duration time.Duration)
 | 
						|
	List() map[string]Item
 | 
						|
}
 | 
						|
 | 
						|
// Item is a cached reference
 | 
						|
type Item struct {
 | 
						|
	Content    []byte
 | 
						|
	Expiration int64
 | 
						|
}
 | 
						|
 | 
						|
// Expired returns true if the item has expired.
 | 
						|
func (item Item) Expired() bool {
 | 
						|
	if item.Expiration == 0 {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
	return time.Now().UnixNano() > item.Expiration
 | 
						|
}
 | 
						|
 | 
						|
//Storage mecanism for caching strings in memory
 | 
						|
type Storage struct {
 | 
						|
	items map[string]Item
 | 
						|
	mu    *sync.RWMutex
 | 
						|
}
 | 
						|
 | 
						|
//NewStorage creates a new in memory CacheStorage
 | 
						|
func NewStorage() *Storage {
 | 
						|
	return &Storage{
 | 
						|
		items: make(map[string]Item),
 | 
						|
		mu:    &sync.RWMutex{},
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (s Storage) List() map[string]Item {
 | 
						|
	return s.items
 | 
						|
}
 | 
						|
 | 
						|
//Get a cached content by key
 | 
						|
func (s Storage) Get(key string) []byte {
 | 
						|
	item := s.items[key]
 | 
						|
	if item.Expired() {
 | 
						|
		CacheStorage.Delete(key)
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
	return item.Content
 | 
						|
}
 | 
						|
 | 
						|
func (s Storage) Delete(key string) {
 | 
						|
	s.mu.Lock()
 | 
						|
	defer s.mu.Unlock()
 | 
						|
	delete(s.items, key)
 | 
						|
}
 | 
						|
 | 
						|
//Set a cached content by key
 | 
						|
func (s Storage) Set(key string, content []byte, duration time.Duration) {
 | 
						|
	s.mu.Lock()
 | 
						|
	defer s.mu.Unlock()
 | 
						|
	s.items[key] = Item{
 | 
						|
		Content:    content,
 | 
						|
		Expiration: time.Now().Add(duration).UnixNano(),
 | 
						|
	}
 | 
						|
}
 |