This fixes a possible race condition that could happen between the Add and Lookup calls when the cache size was small. When an entry was found in the cache during a Lookup call, its value was fetched from the internal list node outside the mutex lock. This could race with a corresponding Add call when the node was actually the LRU node and was about to be overwritten. This could manifest as a race specially when using caches with a very small size, since it becomes more likely to perform a lookup on an entry that is about to be concurrently overwritten. This fixes the issue by moving the code that extracts the value from the node to be performed with the lock held. |
||
|---|---|---|
| .. | ||
| cache_test.go | ||
| cache.go | ||
| doc.go | ||
| example_test.go | ||
| go.mod | ||
| kv_test.go | ||
| kv.go | ||
| README.md | ||
lru
Package lru implements generic least-recently-used caches with near O(1) perf.
LRU Cache
A least-recently-used (LRU) cache is a cache that holds a limited number of items with an eviction policy such that when the capacity of the cache is exceeded, the least-recently-used item is automatically removed when inserting a new item. The meaning of used in this implementation is either accessing the item via a lookup or adding the item into the cache, including when the item already exists.
External Use
This package has intentionally been designed so it can be used as a standalone package for any projects needing to make use of well-tested and concurrent safe least-recently-used caches with near O(1) performance characteristics for lookups, inserts, and deletions.
Installation and Updating
$ go get -u github.com/decred/dcrd/lru
Examples
-
Basic Cache Usage Demonstrates creating a new cache instance, inserting items into the cache, causing an eviction of the least-recently-used item, and removing an item.
-
Basic KV Cache Usage Demonstrates creating a new k/v cache instance, inserting items into the cache, causing an eviction of the least-recently-used item, and removing an item.
License
Package lru is licensed under the copyfree ISC License.