`# Kache: A golang caching library
This package implements a couple of caches with different eviction policies.
Both the caches adhere to the following contract:
```golang
type Cache interface {
// Inserts the provided key/value pair into the cache, making it
// available for future get() calls.
Put(key, value string)
// Returns a value previously provided via put(). An empty Option
// may be returned if the requested data was never inserted or is
// no longer available.
Get(key string) types.Option
}
```
The `Option` struct exposes a `IsPresent()` method to. check for the presence of a value. Use it in conjunction with Get() to get the value returned by the cache.
The exposed cache types are:
#### LRU Cache
As the name suggests, this is a fixed size cache which uses LRU as its eviction policy.
```golang
import "srm.io/kache"
func main() {
// size of the cache
size := 2
lru := kache.NewLRU(size)
lru.Put("foo", "bar")
lru.Put("foo-2", "bar")
// will evict the least recently used key "foo"
lru.Put("foo-3", "bar")
}
```
#### Tiered Cache
This is a 2-tier cache implementation with hot and cold caches. The hot cache is used to store repeatedly accessed keys. The hot cache uses a hybrid of LRU and TTL cache eviction policy, while the cold cache just uses the LRU policy.
Workflow:
- A new key value pair gets added to the cold cache.
- On future accesses, the key value pair gets moved to the hot cache with a TTL mentioned while initializing the cache.
- Any further `Get(key)` calls are serviced by the hot cache till the TTL parameter is valid.
- Any further `Put(key, value)` calls in the hot cache re-initialize the TTL parameter.
- Once the TTL is invalidated, the `key` gets evicted from the hot cache.
```golang
import (
"time"
"srm.io/kache"
)
func main() {
opts := kache.TieredOptions{
HotCacheSize: 2,
TTL: 5 * time.Second
}
cache, err := kache.NewTiered(opts)
if err != nil {
return err
}
cache.Put("foo", "bar")
cache.Put("foo-2", "bar")
// will promote it to hot cache with a TTL value of 5 seconds.
cache.Get("foo")s
}
````