golang-lru 是 HashiCorp 开源的一个 LRU(Least Recently Used,最近最少使用)缓存库,用于 Go 语言项目。

LRU 缓存是一种常见的缓存策略,它会在缓存达到容量限制时移除最近最少使用的条目,从而保持缓存的高效性。

项目介绍

项目名称:HashiCorp golang-lru
GitHub 仓库:hashicorp/golang-lru

描述:这是一个用于 Go 语言的 LRU 缓存实现,提供了线程安全的缓存机制,并且支持多种缓存操作。

线程安全:内部使用互斥锁(mutex)保证缓存操作的并发安全。

多种缓存类型:

简单的 LRU 缓存
双向链表的 LRU 缓存

易用性:提供简洁的 API,可以快速集成到 Go 项目中。

安装方法

你可以使用 go get 命令来安装 golang-lru:

go get github.com/hashicorp/golang-lru

使用示例

以下是一些简单的示例代码,展示如何在你的 Go 项目中使用 golang-lru。

创建一个 LRU 缓存


package main
import (
    "fmt"
    "github.com/hashicorp/golang-lru"
)func main() {
    // 创建一个最大容量为 5 的 LRU 缓存
    cache, err := lru.New(5)
    if err != nil {
        fmt.Println("Error creating LRU cache:", err)
        return
    }    // 添加一些数据到缓存中
    cache.Add("key1", "value1")
    cache.Add("key2", "value2")
    cache.Add("key3", "value3")
    cache.Add("key4", "value4")
    cache.Add("key5", "value5")    // 尝试获取缓存中的数据
    if value, ok := cache.Get("key1"); ok {
        fmt.Println("key1:", value)
    } else {
        fmt.Println("key1 not found in cache")
    }    // 添加超过容量的数据,触发 LRU 机制
    cache.Add("key6", "value6")    // 此时 "key2" 应该被移出缓存,因为它是最早添加的且没有再次被访问
    if value, ok := cache.Get("key2"); ok {
        fmt.Println("key2:", value)
    } else {
        fmt.Println("key2 not found in cache")
    }
}

创建一个带有回调函数的 LRU 缓存

有时你可能需要在元素被移除时执行一些额外操作,可以使用带回调函数的 LRU 缓存。

package main
import (
    "fmt"
    "github.com/hashicorp/golang-lru"
)func main() {
    // 创建一个带有回调函数的 LRU 缓存
    onEvicted := func(key interface{}, value interface{}) {
        fmt.Printf("Evicted: key=%v, value=%v\n", key, value)
    }
    cache, err := lru.NewWithEvict(5, onEvicted)
    if err != nil {
        fmt.Println("Error creating LRU cache:", err)
        return
    }    // 添加一些数据到缓存中
    cache.Add("key1", "value1")
    cache.Add("key2", "value2")
    cache.Add("key3", "value3")
    cache.Add("key4", "value4")
    cache.Add("key5", "value5")    // 添加超过容量的数据,触发 LRU 机制及回调函数
    cache.Add("key6", "value6")
}

高级用法


使用 2Q 缓存


2Q 缓存是对 LRU 缓存的一种改进,适用于某些应用场景下性能更优。


package main
import (
    "fmt"
    "github.com/hashicorp/golang-lru/simplelru"
)func main() {
    // 创建一个最大容量为 5 的 2Q 缓存
    cache, err := simplelru.New2Q(5)
    if err != nil {
        fmt.Println("Error creating 2Q cache:", err)
        return
    }    // 添加一些数据到缓存中
    cache.Add("key1", "value1")
    cache.Add("key2", "value2")
    cache.Add("key3", "value3")
    cache.Add("key4", "value4")
    cache.Add("key5", "value5")    // 添加超过容量的数据,触发 2Q 机制
    cache.Add("key6", "value6")    // 检查某个键是否存在于缓存中
    if value, ok := cache.Get("key2"); ok {
        fmt.Println("key2:", value)
    } else {
        fmt.Println("key2 not found in cache")
    }
}

结论

golang-lru 是一个功能强大且易用的 LRU 缓存库,可以帮助你在 Go 项目中有效地管理缓存数据。无论是简单的 LRU 缓存还是更复杂的 2Q 缓存策略,这个库都能很好地满足需求。如果你希望进一步了解或贡献代码,请访问 GitHub 仓库。