Configurable http caching middleware for Go servers.
Improve API throughput, reduce latency, and save on third-party resources.
- Eviction Policy: FIFO, LRU
- Cache Size: Based on number of entries, or memory usage
- Cache Filters: Filter on URL, method, or header fields
- TTL + Max TTL: Cache expiration and renewal
- Logger: Pass any logger package
- Metrics: Track cache hits, misses, and evictions
import (
"log"
"net/http"
"os"
"time"
"github.com/ztkent/replay"
"github.com/go-chi/chi/v5"
)
func main() {
r := chi.NewRouter()
c := replay.NewCache(
replay.WithMaxSize(100),
replay.WithMaxMemory(100*1024*1024),
replay.WithCacheFilters([]string{"URL", "Method"}),
replay.WithCacheFailures(false),
replay.WithEvictionPolicy("LRU"),
replay.WithTTL(5*time.Minute),
replay.WithMaxTTL(30*time.Minute),
replay.WithLogger(log.New(os.Stdout, "replay: ", log.LstdFlags)),
)
// Apply the middleware to the entire router
r.Use(c.Middleware)
// Or apply it to a specific endpoint
r.Get("/test-endpoint", c.MiddlewareFunc(testHandlerFunc()))
http.ListenAndServe(os.Getenv("SERVER_PORT"), r)
}The cache configured with the following options:
WithMaxSize(maxSize int): Set the maximum number of entries in the cache.WithMaxMemory(maxMemory uint64): Set the maximum memory usage of the cache.WithEvictionPolicy(evictionPolicy string): Set the eviction policy for the cache [FIFO, LRU].WithEvictionTimer(evictionTimer time.Duration): Set the time between cache eviction checks.WithTTL(ttl time.Duration): Set the time a cache entry can live without being accessed.WithMaxTTL(maxTtl time.Duration): Set the maximum time a cache entry can live, including renewals.WithCacheFilters(cacheFilters []string): Set the cache filters to use for generating cache keys.WithCacheFailures(cacheFailures bool): Set whether to cache failed requests.WithLogger(l *log.Logger): Set the logger to use for cache logging.
You can access cache metrics to monitor cache performance:
metrics := c.Metrics()Fields Available:
Hits: Total number of cache hits.Misses: Total number of cache misses.Evictions: Total umber of cache evictions.CurrentSize: Number of entries in the cache.CurrentMemory: Current memory usage of the cache.