LRUExpireCache: Allow removing multiple keys under lock

This commit is contained in:
Taahir Ahmed 2023-10-20 18:05:33 -07:00
parent 599fdb7add
commit e83baddbb1
2 changed files with 27 additions and 0 deletions

View File

@ -136,6 +136,19 @@ func (c *LRUExpireCache) Remove(key interface{}) {
delete(c.entries, key)
}
// RemoveAll removes all keys that match predicate.
func (c *LRUExpireCache) RemoveAll(predicate func(key any) bool) {
c.lock.Lock()
defer c.lock.Unlock()
for key, element := range c.entries {
if predicate(key) {
c.evictionList.Remove(element)
delete(c.entries, key)
}
}
}
// Keys returns all unexpired keys in the cache.
//
// Keep in mind that subsequent calls to Get() for any of the returned keys

View File

@ -67,6 +67,20 @@ func TestSimpleRemove(t *testing.T) {
expectNotEntry(t, c, "long-lived")
}
func TestSimpleRemoveAll(t *testing.T) {
c := NewLRUExpireCache(10)
c.Add("long-lived", "12345", 10*time.Hour)
c.Add("other-long-lived", "12345", 10*time.Hour)
c.RemoveAll(func(k any) bool {
return k.(string) == "long-lived"
})
assertKeys(t, c.Keys(), []any{"other-long-lived"})
expectNotEntry(t, c, "long-lived")
expectEntry(t, c, "other-long-lived", "12345")
}
func TestExpiredGet(t *testing.T) {
fakeClock := testingclock.NewFakeClock(time.Now())
c := NewLRUExpireCacheWithClock(10, fakeClock)