mirror of
https://github.com/FlipsideCrypto/dcrd.git
synced 2026-02-06 10:56:47 +00:00
This implements a new module named lru which provides a concurrency safe least-recently-used cache with nearly early O(1) lookups, inserts, and deletions. The cache is limited to a maximum number of items with eviction for the oldest entry when the limit is exceeded. This will allow the various concrete implementations to be updated to make use of this shared module instead of duplicating code. There is no additional performance hit to making use of this generic version because the internal list already causes the item to be boxed anyway, so the addition of the interface for the type does not cause an additional alloc. This can be seen by comparing this generic implementation to the existing concrete nonce implementation in peer: BenchmarkCache 1 allocs/op BenchmarkLruNonceList 1 allocs/op It also includes comprehensive tests, a benchmark, full package documentation, and a basic usage example.
51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
// Copyright (c) 2019 The Decred developers
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package lru_test
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/decred/dcrd/lru"
|
|
)
|
|
|
|
// This example demonstrates creating a new cache instance, inserting items into
|
|
// the cache, causing an eviction of the least-recently-used item, and removing
|
|
// an item.
|
|
func Example_basicUsage() {
|
|
// Create a new cache instance with the desired limit.
|
|
const maxItems = 100
|
|
cache := lru.NewCache(maxItems)
|
|
|
|
// Insert items into the cache.
|
|
for i := 0; i < maxItems; i++ {
|
|
cache.Add(i)
|
|
}
|
|
|
|
// At this point, the cache has reached the limit, so the first entry will
|
|
// still be a member of the cache.
|
|
if !cache.Contains(0) {
|
|
fmt.Println("cache does not contain expected item 0")
|
|
return
|
|
}
|
|
|
|
// Adding another item will evict the least-recently-used item, which will
|
|
// be the value 1 since 0 was just accessed above.
|
|
cache.Add(int(maxItems) + 1)
|
|
if cache.Contains(1) {
|
|
fmt.Println("cache contains unexpected item 1")
|
|
return
|
|
}
|
|
|
|
// Remove an item from the cache.
|
|
cache.Delete(3)
|
|
if cache.Contains(3) {
|
|
fmt.Println("cache contains unexpected item 3")
|
|
return
|
|
}
|
|
|
|
// Output:
|
|
//
|
|
}
|