Skip to content

Commit

Permalink
fix Len, Keys, and GetALL method to get checkExpired option
Browse files Browse the repository at this point in the history
  • Loading branch information
bluele committed May 18, 2019
1 parent 79ae3b2 commit d759f94
Show file tree
Hide file tree
Showing 10 changed files with 144 additions and 92 deletions.
54 changes: 29 additions & 25 deletions arc.go
Original file line number Diff line number Diff line change
Expand Up @@ -313,45 +313,49 @@ func (c *ARC) remove(key interface{}) bool {
return false
}

func (c *ARC) keys() []interface{} {
// GetALL returns all key-value pairs in the cache.
func (c *ARC) GetALL(checkExpired bool) map[interface{}]interface{} {
c.mu.RLock()
defer c.mu.RUnlock()
keys := make([]interface{}, len(c.items))
var i = 0
for k := range c.items {
keys[i] = k
i++
items := make(map[interface{}]interface{}, len(c.items))
now := time.Now()
for k, item := range c.items {
if checkExpired && c.has(k, &now) {
items[k] = item.value
}
}
return keys
return items
}

// Keys returns a slice of the keys in the cache.
func (c *ARC) Keys() []interface{} {
keys := []interface{}{}
for _, k := range c.keys() {
_, err := c.GetIFPresent(k)
if err == nil {
func (c *ARC) Keys(checkExpired bool) []interface{} {
c.mu.RLock()
defer c.mu.RUnlock()
keys := make([]interface{}, 0, len(c.items))
now := time.Now()
for k := range c.items {
if checkExpired && c.has(k, &now) {
keys = append(keys, k)
}
}
return keys
}

// GetALL returns all key-value pairs in the cache.
func (c *ARC) GetALL() map[interface{}]interface{} {
m := make(map[interface{}]interface{})
for _, k := range c.keys() {
v, err := c.GetIFPresent(k)
if err == nil {
m[k] = v
// Len returns the number of items in the cache.
func (c *ARC) Len(checkExpired bool) int {
c.mu.RLock()
defer c.mu.RUnlock()
if !checkExpired {
return len(c.items)
}
var length int
now := time.Now()
for k := range c.items {
if c.has(k, &now) {
length++
}
}
return m
}

// Len returns the number of items in the cache.
func (c *ARC) Len() int {
return len(c.GetALL())
return length
}

// Purge is used to completely clear the cache
Expand Down
4 changes: 2 additions & 2 deletions arc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ func TestARCLength(t *testing.T) {
gc.Get("test1")
gc.Get("test2")
gc.Get("test3")
length := gc.Len()
length := gc.Len(true)
expectedLength := 2
if length != expectedLength {
t.Errorf("Expected length is %v, not %v", expectedLength, length)
}
time.Sleep(time.Millisecond)
gc.Get("test4")
length = gc.Len()
length = gc.Len(true)
expectedLength = 1
if length != expectedLength {
t.Errorf("Expected length is %v, not %v", expectedLength, length)
Expand Down
8 changes: 4 additions & 4 deletions cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ type Cache interface {
SetWithExpire(interface{}, interface{}, time.Duration) error
Get(interface{}) (interface{}, error)
GetIFPresent(interface{}) (interface{}, error)
GetALL() map[interface{}]interface{}
Has(interface{}) bool
GetALL(bool) map[interface{}]interface{}
get(interface{}, bool) (interface{}, error)
Remove(interface{}) bool
Purge()
Keys() []interface{}
Len() int
Keys(bool) []interface{}
Len(bool) int
Has(interface{}) bool

statsAccessor
}
Expand Down
4 changes: 2 additions & 2 deletions helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ func testGetALL(t *testing.T, evT string) {
for i := 0; i < size; i++ {
cache.Set(i, i*i)
}
m := cache.GetALL()
m := cache.GetALL(true)
for i := 0; i < size; i++ {
v, ok := m[i]
if !ok {
Expand All @@ -87,7 +87,7 @@ func testGetALL(t *testing.T, evT string) {
time.Sleep(time.Millisecond)

cache.Set(size, size*size)
m = cache.GetALL()
m = cache.GetALL(true)
if len(m) != 1 {
t.Errorf("%v != %v", len(m), 1)
}
Expand Down
52 changes: 34 additions & 18 deletions lfu.go
Original file line number Diff line number Diff line change
Expand Up @@ -266,33 +266,49 @@ func (c *LFUCache) keys() []interface{} {
return keys
}

// Keys returns a slice of the keys in the cache.
func (c *LFUCache) Keys() []interface{} {
keys := []interface{}{}
for _, k := range c.keys() {
_, err := c.GetIFPresent(k)
if err == nil {
keys = append(keys, k)
// GetALL returns all key-value pairs in the cache.
func (c *LFUCache) GetALL(checkExpired bool) map[interface{}]interface{} {
c.mu.RLock()
defer c.mu.RUnlock()
items := make(map[interface{}]interface{}, len(c.items))
now := time.Now()
for k, item := range c.items {
if checkExpired && c.has(k, &now) {
items[k] = item.value
}
}
return keys
return items
}

// GetALL returns all key-value pairs in the cache.
func (c *LFUCache) GetALL() map[interface{}]interface{} {
m := make(map[interface{}]interface{})
for _, k := range c.keys() {
v, err := c.GetIFPresent(k)
if err == nil {
m[k] = v
// Keys returns a slice of the keys in the cache.
func (c *LFUCache) Keys(checkExpired bool) []interface{} {
c.mu.RLock()
defer c.mu.RUnlock()
keys := make([]interface{}, 0, len(c.items))
now := time.Now()
for k := range c.items {
if checkExpired && c.has(k, &now) {
keys = append(keys, k)
}
}
return m
return keys
}

// Len returns the number of items in the cache.
func (c *LFUCache) Len() int {
return len(c.GetALL())
func (c *LFUCache) Len(checkExpired bool) int {
c.mu.RLock()
defer c.mu.RUnlock()
if !checkExpired {
return len(c.items)
}
var length int
now := time.Now()
for k := range c.items {
if c.has(k, &now) {
length++
}
}
return length
}

// Completely clear the cache
Expand Down
4 changes: 2 additions & 2 deletions lfu_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ func TestLFULength(t *testing.T) {
gc := buildTestLoadingCache(t, TYPE_LFU, 1000, loader)
gc.Get("test1")
gc.Get("test2")
length := gc.Len()
length := gc.Len(true)
expectedLength := 2
if gc.Len() != expectedLength {
if length != expectedLength {
t.Errorf("Expected length is %v, not %v", length, expectedLength)
}
}
Expand Down
52 changes: 34 additions & 18 deletions lru.go
Original file line number Diff line number Diff line change
Expand Up @@ -236,33 +236,49 @@ func (c *LRUCache) keys() []interface{} {
return keys
}

// Keys returns a slice of the keys in the cache.
func (c *LRUCache) Keys() []interface{} {
keys := []interface{}{}
for _, k := range c.keys() {
_, err := c.GetIFPresent(k)
if err == nil {
keys = append(keys, k)
// GetALL returns all key-value pairs in the cache.
func (c *LRUCache) GetALL(checkExpired bool) map[interface{}]interface{} {
c.mu.RLock()
defer c.mu.RUnlock()
items := make(map[interface{}]interface{}, len(c.items))
now := time.Now()
for k, item := range c.items {
if checkExpired && c.has(k, &now) {
items[k] = item.Value.(*lruItem).value
}
}
return keys
return items
}

// GetALL returns all key-value pairs in the cache.
func (c *LRUCache) GetALL() map[interface{}]interface{} {
m := make(map[interface{}]interface{})
for _, k := range c.keys() {
v, err := c.GetIFPresent(k)
if err == nil {
m[k] = v
// Keys returns a slice of the keys in the cache.
func (c *LRUCache) Keys(checkExpired bool) []interface{} {
c.mu.RLock()
defer c.mu.RUnlock()
keys := make([]interface{}, 0, len(c.items))
now := time.Now()
for k := range c.items {
if checkExpired && c.has(k, &now) {
keys = append(keys, k)
}
}
return m
return keys
}

// Len returns the number of items in the cache.
func (c *LRUCache) Len() int {
return len(c.GetALL())
func (c *LRUCache) Len(checkExpired bool) int {
c.mu.RLock()
defer c.mu.RUnlock()
if !checkExpired {
return len(c.items)
}
var length int
now := time.Now()
for k := range c.items {
if c.has(k, &now) {
length++
}
}
return length
}

// Completely clear the cache
Expand Down
2 changes: 1 addition & 1 deletion lru_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func TestLRULength(t *testing.T) {
gc := buildTestLoadingCache(t, TYPE_LRU, 1000, loader)
gc.Get("test1")
gc.Get("test2")
length := gc.Len()
length := gc.Len(true)
expectedLength := 2
if length != expectedLength {
t.Errorf("Expected length is %v, not %v", length, expectedLength)
Expand Down
52 changes: 34 additions & 18 deletions simple.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,33 +227,49 @@ func (c *SimpleCache) keys() []interface{} {
return keys
}

// Keys returns a slice of the keys in the cache.
func (c *SimpleCache) Keys() []interface{} {
keys := []interface{}{}
for _, k := range c.keys() {
_, err := c.GetIFPresent(k)
if err == nil {
keys = append(keys, k)
// GetALL returns all key-value pairs in the cache.
func (c *SimpleCache) GetALL(checkExpired bool) map[interface{}]interface{} {
c.mu.RLock()
defer c.mu.RUnlock()
items := make(map[interface{}]interface{})
now := time.Now()
for k, item := range c.items {
if checkExpired && c.has(k, &now) {
items[k] = item.value
}
}
return keys
return items
}

// GetALL returns all key-value pairs in the cache.
func (c *SimpleCache) GetALL() map[interface{}]interface{} {
m := make(map[interface{}]interface{})
for _, k := range c.keys() {
v, err := c.GetIFPresent(k)
if err == nil {
m[k] = v
// Keys returns a slice of the keys in the cache.
func (c *SimpleCache) Keys(checkExpired bool) []interface{} {
c.mu.RLock()
defer c.mu.RUnlock()
keys := make([]interface{}, 0, len(c.items))
now := time.Now()
for k := range c.items {
if checkExpired && c.has(k, &now) {
keys = append(keys, k)
}
}
return m
return keys
}

// Len returns the number of items in the cache.
func (c *SimpleCache) Len() int {
return len(c.GetALL())
func (c *SimpleCache) Len(checkExpired bool) int {
c.mu.RLock()
defer c.mu.RUnlock()
if !checkExpired {
return len(c.items)
}
var length int
now := time.Now()
for k := range c.items {
if c.has(k, &now) {
length++
}
}
return length
}

// Completely clear the cache
Expand Down
4 changes: 2 additions & 2 deletions simple_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func TestSimpleLength(t *testing.T) {
gc := buildTestLoadingCache(t, TYPE_SIMPLE, 1000, loader)
gc.Get("test1")
gc.Get("test2")
length := gc.Len()
length := gc.Len(true)
expectedLength := 2
if length != expectedLength {
t.Errorf("Expected length is %v, not %v", length, expectedLength)
Expand All @@ -49,7 +49,7 @@ func TestSimpleUnboundedNoEviction(t *testing.T) {
gcu := buildTestLoadingCache(t, TYPE_SIMPLE, 0, loader)

for i := 0; i < numbers; i++ {
current_size := gcu.Len()
current_size := gcu.Len(true)
if current_size != size_tracker {
t.Errorf("Excepted cache size is %v not %v", current_size, size_tracker)
}
Expand Down

0 comments on commit d759f94

Please sign in to comment.