github.com/bytom/bytom@v1.1.2-0.20221014091027-bbcba3df6075/common/concurrent_lru.go (about) 1 package common 2 3 import ( 4 "sync" 5 6 "github.com/golang/groupcache/lru" 7 ) 8 9 // Cache is an LRU cache. It is safe for concurrent access. 10 type Cache struct { 11 cache *lru.Cache 12 sync.RWMutex 13 } 14 15 // NewCache creates a new Cache. 16 // If maxEntries is zero, the cache has no limit and it's assumed 17 // that eviction is done by the caller. 18 func NewCache(maxEntries int) *Cache { 19 return &Cache{cache: lru.New(maxEntries)} 20 } 21 22 // Add adds a value to the cache. 23 func (c *Cache) Add(key, value interface{}) { 24 c.Lock() 25 defer c.Unlock() 26 c.cache.Add(key, value) 27 } 28 29 // Get looks up a key's value from the cache. 30 func (c *Cache) Get(key interface{}) (value interface{}, ok bool) { 31 c.Lock() 32 defer c.Unlock() 33 return c.cache.Get(key) 34 } 35 36 // Remove removes the provided key from the cache. 37 func (c *Cache) Remove(key interface{}) { 38 c.Lock() 39 defer c.Unlock() 40 c.cache.Remove(key) 41 } 42 43 // RemoveOldest removes the oldest item from the cache. 44 func (c *Cache) RemoveOldest() { 45 c.Lock() 46 defer c.Unlock() 47 c.cache.RemoveOldest() 48 } 49 50 // Len returns the number of items in the cache. 51 func (c *Cache) Len() int { 52 c.RLock() 53 defer c.RUnlock() 54 return c.cache.Len() 55 } 56 57 // Clear purges all stored items from the cache. 58 func (c *Cache) Clear() { 59 c.Lock() 60 defer c.Unlock() 61 c.cache.Clear() 62 }