Fetch does not return stale items
This commit is contained in:
parent
74754c77cc
commit
d5307b40af
2 changed files with 22 additions and 5 deletions
8
cache.go
8
cache.go
|
@ -81,12 +81,12 @@ func (c *Cache) Replace(key string, value interface{}) bool {
|
|||
return true
|
||||
}
|
||||
|
||||
// Attempts to get the value from the cache and calles fetch on a miss.
|
||||
// If fetch returns an error, no value is cached and the error is returned back
|
||||
// to the caller.
|
||||
// Attempts to get the value from the cache and calles fetch on a miss (missing
|
||||
// or stale item). If fetch returns an error, no value is cached and the error
|
||||
// is returned back to the caller.
|
||||
func (c *Cache) Fetch(key string, duration time.Duration, fetch func() (interface{}, error)) (*Item, error) {
|
||||
item := c.Get(key)
|
||||
if item != nil {
|
||||
if item != nil && !item.Expired() {
|
||||
return item, nil
|
||||
}
|
||||
value, err := fetch()
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
package ccache
|
||||
|
||||
import (
|
||||
. "github.com/karlseguin/expect"
|
||||
"strconv"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
. "github.com/karlseguin/expect"
|
||||
)
|
||||
|
||||
type CacheTests struct{}
|
||||
|
@ -22,6 +23,22 @@ func (_ CacheTests) DeletesAValue() {
|
|||
Expect(cache.Get("worm").Value()).To.Equal("sand")
|
||||
}
|
||||
|
||||
func (_ CacheTests) FetchesExpiredItems() {
|
||||
cache := New(Configure())
|
||||
fn := func() (interface{}, error) { return "moo-moo", nil }
|
||||
|
||||
cache.Set("beef", "moo", time.Second)
|
||||
Expect(cache.Get("beef").Value()).To.Equal("moo")
|
||||
|
||||
out, _ := cache.Fetch("beef", time.Second, fn)
|
||||
Expect(out.Value()).To.Equal("moo")
|
||||
|
||||
time.Sleep(2 * time.Second)
|
||||
|
||||
out2, _ := cache.Fetch("beef", time.Second, fn)
|
||||
Expect(out2.Value()).To.Equal("moo-moo")
|
||||
}
|
||||
|
||||
func (_ CacheTests) GCsTheOldestItems() {
|
||||
cache := New(Configure().ItemsToPrune(10))
|
||||
for i := 0; i < 500; i++ {
|
||||
|
|
Loading…
Reference in a new issue