Documentation ¶
Overview ¶
Package cache implements Cache similar to hashicorp/golang-lru
Support LRC, LRU and TTL-based eviction. Package is thread-safe and doesn't spawn any goroutines. On every Set() call, cache deletes single oldest entry in case it's expired. In case MaxSize is set, cache deletes the oldest entry disregarding its expiration date to maintain the size, either using LRC or LRU eviction. In case of default TTL (10 years) and default MaxSize (0, unlimited) the cache will be truly unlimited and will never delete entries from itself automatically.
Important: only reliable way of not having expired entries stuck in a cache is to run cache.DeleteExpired periodically using time.Ticker, advisable period is 1/2 of TTL.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Cache ¶ added in v0.0.3
type Cache interface { fmt.Stringer Set(key string, value interface{}, ttl time.Duration) Get(key string) (interface{}, bool) Peek(key string) (interface{}, bool) Keys() []string Len() int Invalidate(key string) InvalidateFn(fn func(key string) bool) RemoveOldest() DeleteExpired() Purge() Stat() Stats }
Cache defines cache interface
Example ¶
// make cache with short TTL and 3 max keys cache, _ := NewCache(MaxKeys(3), TTL(time.Millisecond*10)) // set value under key1. // with 0 ttl (last parameter) will use cache-wide setting instead (10ms). cache.Set("key1", "val1", 0) // get value under key1 r, ok := cache.Get("key1") // check for OK value, because otherwise return would be nil and // type conversion will panic if ok { rstr := r.(string) // convert cached value from interface{} to real type fmt.Printf("value before expiration is found: %v, value: %v\n", ok, rstr) } time.Sleep(time.Millisecond * 11) // get value under key1 after key expiration r, ok = cache.Get("key1") // don't convert to string as with ok == false value would be nil fmt.Printf("value after expiration is found: %v, value: %v\n", ok, r) // set value under key2, would evict old entry because it is already expired. // ttl (last parameter) overrides cache-wide ttl. cache.Set("key2", "val2", time.Minute*5) fmt.Printf("%+v\n", cache)
Output: value before expiration is found: true, value: val1 value after expiration is found: false, value: <nil> Size: 1, Stats: {Hits:1 Misses:1 Added:2 Evicted:1} (50.0%)